C# 两种不同的种子产生相同的';随机';序列
也许对此有一个非常合乎逻辑的解释,但我似乎无法理解为什么种子C# 两种不同的种子产生相同的';随机';序列,c#,.net,random,integer,C#,.net,Random,Integer,也许对此有一个非常合乎逻辑的解释,但我似乎无法理解为什么种子0和2147483647使用.NET生成相同的“随机”序列 快速代码示例: var random1 = new Random(0); var random2 = new Random(1); var random3 = new Random(int.MaxValue); //2,147,483,647 var buffer1 = new byte[8]; var buffer2 = new byte[8]; var buffer3 =
0
和2147483647
使用.NET生成相同的“随机”序列
快速代码示例:
var random1 = new Random(0);
var random2 = new Random(1);
var random3 = new Random(int.MaxValue); //2,147,483,647
var buffer1 = new byte[8];
var buffer2 = new byte[8];
var buffer3 = new byte[8];
random1.NextBytes(buffer1);
random2.NextBytes(buffer2);
random3.NextBytes(buffer3);
for (int i = 0; i < 8; i++)
{
Console.WriteLine("{0}\t\t{1}\t\t{2}", buffer1[i], buffer2[i], buffer3[i]);
}
如您所见,第一个和第三个序列是相同的。有人能给我解释一下吗
编辑:显然,正如阿尔罗所指出的,这些序列并不相同。但是它们非常相似。原因将与随机类使用的任何派生函数有关,以从种子派生伪随机序列。因此,真正的答案是数学的(超出了我的能力) 事实上,我不相信有任何保证,两个不同的种子一定会产生不同的序列 编辑好的-我将做bitbonk做过的事-但请解释原因: 在第一个循环之后,算法已经收敛到两个种子值 编辑
正如在这个问题上所指出的那样——序列不同——但它们显然非常相似——在这里我们可以看到这种相似性的原因。
系统。随机的
在许多方面被设计打破。这是其中之一。非常有趣的观察+1@我明白了。这很奇怪。显然,这个功能并不完美(微软,你怎么会这样!难道没有人会指出他的结果不一样吗?第三和第六个数字是不同的。@阿尔罗这没关系,因为他们所说的功能是生成一个预先计算好的种子数组。然后用它来生成每个样本。该数组中相同的种子越多,得到的ra序列就越接近ndom数字(在本例中,数组只相差一项),但是…两个序列不应该重复相同的数字模式…感谢您提供的详细信息!值得注意的是{0,int.Max,int.Min}结果是相同的种子,正如这个线程所证明的。我想知道这个实现是否还有其他这样的共同种子,以及有多少共同种子?如果有更多的共同种子,那将为一篇文章奠定良好的基础:)+1干得好@Quetzalcatl我认为它是一个系统。随机实现甚至不打算成为一个像样的随机数生成器,而是一个随时可用的、非常快速的例程,每次您甚至不必考虑它的优点。这就是为什么(即使在框架内)有这么多不同的实现。@Adriano,但文档中包含了更多内容。如果您的应用程序需要不同的随机数序列,请使用不同的种子值重复调用此构造函数。@ReacherGilt:我认为说他不应该得到这么好的答案是不公平的。他问了一个很好的问题,关于什么对他来说可能是一段黑匣子代码。我不知道那本书,作为一个不使用C语言编程的人,我可能不会想到去读它。你找到答案的方法是对的,但这仍然是一个有着好答案的好问题。@ReacherGilt:我不知道我是否看到了一个好的答案。当我看到它时,它只是复制和粘贴上面的构造函数代码,没有任何实际的答案。但我不是说没有好的答案。我只是不确定,公平地说,这是应得的。如果是这样的话,这将意味着一个糟糕的问题,而评级(在撰写本文时上升16,没有下降)表明情况远非如此。
26 70 26
12 208 12
70 134 76
111 130 111
93 64 93
117 151 115
228 228 228
216 163 216
public Random(int Seed)
{
int num = (Seed == -2147483648) ? 2147483647 : Math.Abs(Seed);
int num2 = 161803398 - num;
this.SeedArray[55] = num2;
int num3 = 1;
for (int i = 1; i < 55; i++)
{
int num4 = 21 * i % 55;
this.SeedArray[num4] = num3;
num3 = num2 - num3;
if (num3 < 0)
{
num3 += 2147483647;
}
num2 = this.SeedArray[num4];
}
for (int j = 1; j < 5; j++)
{
for (int k = 1; k < 56; k++)
{
this.SeedArray[k] -= this.SeedArray[1 + (k + 30) % 55];
if (this.SeedArray[k] < 0)
{
this.SeedArray[k] += 2147483647;
}
}
}
this.inext = 0;
this.inextp = 21;
Seed = 1;
}
int num = (Seed == -2147483648) ? 2147483647 : Math.Abs(Seed);
=> num is 0 and 2147483647
int num2 = 161803398 - num;
=> num2 is 161803398 and -1985680249
this.SeedArray[55] = num2;
=> this.SeedArray is as above in both cases
int num3 = 1;
for (int i = 1; i < 55; i++)
{
int num4 = 21 * i % 55
this.SeedArray[num4] = num3;
=> num4 is 21, SeedArray[21] is 1
num3 = num2 - num3
=> num3 is 161803397 and -1985680250
if(num3 < 0)
num3 += 2147483647
=> num3 is 161803397 and 161803397