Random()。Next()流需要多长时间才能重复?

时间:2010-01-12 16:18:31

标签: c# random cycle

考虑.NET Random流:

var r = new Random(); 
while (true) 
{ 
    r.Next(); 
}

重复需要多长时间?

1 个答案:

答案 0 :(得分:13)

根据文件:

  

从有限的概率中选择具有相等概率的伪随机数   一组数字。所选的数字是   不是完全随机的,因为a   确定的数学算法是   用来选择它们,但它们是   足够随意实用   目的。目前的实施   Random类的基础是唐纳德   E. Knuth的减法随机数   发电机算法。更多   有关信息,请参阅D. E. Knuth。 “艺术   计算机程序设计,第2卷:   数值算法“。   Addison-Wesley,Reading,MA,第二名   版,1981。

减法发生器(Knuth,Vol 2) Xf,n =(Xf,n-k-Xf,n-j)mod 1。 有关k和j的可能值的表,请参见Knuth。我们选择k = 63,j = 31.这个生成器很有意思,因为:

  • 它有很长一段时间。该序列中最低有效位的周期为2 k -1。实际的时间比这长得多。
  • 有一些温和的限制,所涉及的浮点算法是准确的!

当X是表格时,第二个属性成立     l 247        (0 l< 247) 单精度算法在Crays(48位尾数)上是精确的,在IEEE兼容机器上也是双精度算术。

这允许Fortran代码生成基本随机数序列

  x(n) = x(n-k) - x(n-j)
  if (x(n) < 0.0) x(n) = 1.0 + x(n)

实际上,随机数会根据需要分批生成并存储在充当循环缓冲区的数组中。

提到的算法的周期取决于种子值 - 您可以找到more details here