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

aha*_*ron 9 c# random cycle

考虑.NET Random流:

var r = new Random(); 
while (true) 
{ 
    r.Next(); 
}
Run Code Online (Sandbox Code Playgroud)

重复需要多长时间?

LBu*_*kin 13

根据文件:

从有限的数字集合中以相等的概率选择伪随机数.所选择的数字不是完全随机的,因为使用确定的数学算法来选择它们,但是出于实际目的它们是足够随机的.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的形式为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)
Run Code Online (Sandbox Code Playgroud)

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

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