10

.NETRandomストリームを考えてみましょう:

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

繰り返すのにどれくらい時間がかかりますか?

4

1 に答える 1

12

ドキュメントによると:

疑似乱数は、有限の数のセットから等しい確率で選択されます。選択された数は、明確な数学的アルゴリズムを使用して選択されるため、完全にランダムではありませんが、実用的な目的には十分にランダムです。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を選択します。このジェネレーターは、次の理由で興味深いものです。

  • 期間が長いです。このシーケンスの最下位ビットの周期は2k -1です。実際の期間はこれよりはるかに長いです。
  • 若干の制限がありますが、関連する浮動小数点演算は正確です。

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)

実際には、乱数は必要に応じてバッチで生成され、循環バッファーとして機能する配列に格納されます。

上記のアルゴリズムには、シード値に依存する期間があります。詳細については、こちらをご覧ください

于 2010-01-12T16:30:55.887 に答える