【问题标题】:Prediciting next numbers in a .Net random sequence预测 .Net 随机序列中的下一个数字
【发布时间】:2023-03-05 07:08:01
【问题描述】:

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

我知道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 实现中明显的bug,他们使用34 而不是24。我也尝试过,再次没有运气。

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

【问题讨论】:

标签: c# .net random


【解决方案1】:

如果您尝试复制 System.Random 当前所做的事情,我建议您查看 source code itself

快速浏览一下该代码,似乎最接近您的 m 值的是 MBIG (int.MaxValue)。每个生成的随机值都介于 0 和 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2016-12-05
    相关资源
    最近更新 更多