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