在.NET随机序列中预测下一个数字

4

我想要做的是预测由System.Random生成的一系列整数中的下一个数字,这些整数是从现有的56+随机整数序列中生成的。

我知道System.Random使用D. E. Knuth的书中的减法算法,并且在给定最后55个整数的情况下,序列中的下一个整数将是:

seq[n] = (seq[n-55] - seq[n-24]) % m

我试图通过蛮力法生成一个随机列表并查找m

var rnd = new Random();
var list = new List<int>();
for(var i=0; i< 56; i++)
    list.Add(rnd.Next());

var n1 = list[0];
var n2 = list[31];
var n = list[55];

Console.WriteLine("{0} = ({1} - {2}) % m", n, n1, n2);
for(var i = 1; i< int.MaxValue; i++)
{
    if (n == (n1 - n2) % i)
        Console.WriteLine("m = {0}", i);
}

它没有起作用。我注意到System.Random实现中存在一个明显的漏洞,他们使用了34而不是24。我也尝试了那个,但还是没有运气。

如果有人能告诉我我做错了什么,我将不胜感激。


5
根据 Donald E. Knuth 的减法随机数生成器算法的 修改版 实现...。 - Ranger
1个回答

4
如果您想要复制当前System.Random的功能,我建议查看源代码。从快速浏览该代码来看,似乎与您的m值最接近的是MBIG (int.MaxValue)。每个生成的随机值都在0和MBIG之间(不包括MBIG):
int retVal; int locINext = inext; int locINextp = inextp;
      if (++locINext >=56) locINext=1;
      if (++locINextp>= 56) locINextp = 1;

      retVal = SeedArray[locINext]-SeedArray[locINextp];

      if (retVal == MBIG) retVal--;          
      if (retVal<0) retVal+=MBIG;

      SeedArray[locINext]=retVal;

      inext = locINext;
      inextp = locINextp;

      return retVal;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接