10

考虑 .NETRandom流:

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

重复需要多长时间?

4

1 回答 1

12

根据文档:

从一组有限的数字中以相等的概率选择伪随机数。选择的数字不是完全随机的,因为使用了明确的数学算法来选择它们,但它们对于实际目的来说是足够随机的。Random 类的当前实现基于 Donald E. Knuth 的减法随机数生成器算法。有关详细信息,请参阅 DE Knuth。“计算机编程的艺术,第 2 卷:半数值算法”。Addison-Wesley,马萨诸塞州雷丁,第二版,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)

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

提到的算法有一个取决于种子值的周期——你可以在这里找到更多细节

于 2010-01-12T16:30:55.887 回答