Two different seeds producing the same 'random' sequence

后端 未结 1 610
囚心锁ツ
囚心锁ツ 2020-12-31 00:48

Maybe there is a very logic explanation for this, but I just can\'t seem to understand why the seeds 0 and 2,147,483,647 produce the same \"random\

相关标签:
1条回答
  • 2020-12-31 01:02

    Well, the reason will be connected with whatever derivation function is used by the Random class to derive a pseudo-random sequence from the seed. The real answer, therefore, is mathematical (and beyond my ability).

    Indeed - I don't believe there's any guarantee that two different seeds will necessarily produce different sequences anyway.

    Edit Okay - I'm going to do what bitbonk has done - but explain why:

    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;
    } 
    

    We don't actually need to go too far into the code to see why - reading the code from top to bottom these are the values that will be stored by the above code when the seed is 0 and when the seed is 2147483647:

    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
    

    After just the very first loop, algorithm has already converged for the two seed values.

    Edit

    As has been pointed out on the question - the sequences aren't the same - but they are clearly very very similar - and here we can see the reason for that similarity.

    0 讨论(0)
提交回复
热议问题