考虑 .NETRandom
流:
var r = new Random();
while (true)
{
r.Next();
}
重复需要多长时间?
根据文档:
从一组有限的数字中以相等的概率选择伪随机数。选择的数字不是完全随机的,因为使用了明确的数学算法来选择它们,但它们对于实际目的来说是足够随机的。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。这个生成器很有趣,因为:
当 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)
在实践中,随机数是根据需要分批生成的,并存储在一个数组中,该数组充当循环缓冲区。
提到的算法有一个取决于种子值的周期——你可以在这里找到更多细节。