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

考虑.NET Random流:

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

重复需要多长时间?

根据文件:

从有限的数字集合中以相等的概率选择伪随机数。 所选择的数字不是完全随机的,因为使用确定的数学算法来选择它们,但是出于实际目的它们是足够随机的。 Random类的当前实现基于Donald E. Knuth的减法随机数生成器算法。 有关更多信息,请参阅DE Knuth。 “计算机编程的艺术,第2卷:研究数学算法”。 Addison-Wesley,Reading,MA,第二版,1981。

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

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

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

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

  x(n) = x(nk) - x(nj) if (x(n) < 0.0) x(n) = 1.0 + x(n) 

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

提到的算法的周期取决于种子值 - 您可以在此处找到更多详细信息 。