.NETRandom
ストリームを考えてみましょう:
var r = new Random();
while (true)
{
r.Next();
}
繰り返すのにどれくらい時間がかかりますか?
ドキュメントによると:
疑似乱数は、有限の数のセットから等しい確率で選択されます。選択された数は、明確な数学的アルゴリズムを使用して選択されるため、完全にランダムではありませんが、実用的な目的には十分にランダムです。Randomクラスの現在の実装は、DonaldE.Knuthの減算乱数ジェネレーターアルゴリズムに基づいています。詳細については、DEKnuthを参照してください。「TheArtofComputer Programming、volume 2:SeminumericalAlgorithms」。アディソン-ウェスリー、レディング、マサチューセッツ州、第2版、1981年。
サブトラクティブジェネレーター(Knuth、Vol 2)Xf、n =(Xf、nk-Xf、nj)mod 1. kとjの可能な値の表については、Knuthを参照してください。k = 63、j = 31を選択します。このジェネレーターは、次の理由で興味深いものです。
Xがl247(0�l<247)の形式の場合、2番目のプロパティが成り立ちます。単精度演算はCrays(48ビット仮数)で正確であり、IEEE準拠のマシンでの倍精度演算も同様です。
これにより、基本的な乱数シーケンスをFortranコードで生成できます。
x(n) = x(n-k) - x(n-j)
if (x(n) < 0.0) x(n) = 1.0 + x(n)
実際には、乱数は必要に応じてバッチで生成され、循環バッファーとして機能する配列に格納されます。
上記のアルゴリズムには、シード値に依存する期間があります。詳細については、こちらをご覧ください。