161803398は「特別な」番号ですか?Math.Random()の内部


162

答えは「数学ため」ではないかと思いますが、誰かが基本的なレベルでもう少し洞察を与えてくれることを望んでいました...

今日は、BCLソースコードをざっと見て、以前に使用したクラスの一部が実際にどのように実装されているかを確認しました。(疑似)乱数を生成する方法についてこれまで考えたことがないので、どうやってそれを行うかを確認することにしました。

ここで完全なソース:http : //referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

このMSEED値は、Random()クラスがシードされるたびに使用されます。

とにかく、私はこの「マジックナンバー」-161803398-を見ました、そして私はそのナンバーが選ばれた理由について最も曖昧な考えを持っていません。これは素数でも2の累乗でもありません。より重要であるように見える数の「中間」ではありません。私はそれを2進数と16進数で見て、まあ、それは私には数のように見えました。

Googleで番号を検索してみましたが、何も見つかりませんでした。



6
@ 48klocs:それはドキュメントでそう言っています:The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good

4
@ 48klocsはい、ページ283はこちら:apps.nrbook.com/c/index.html彼の理由は「数学のため」のようです。
esh、2014年

22
@eshs:興味深い事実:リンクのページ283に表示されますinextp = 31;が、Randomクラスのソースコードにはinextp = 21;、誰かがタイプミスしたためにこのバグが発生したように表示されます。
Jesse Good

7
@Izkata短期的な目標(特定の質問をクローズしないこと)を目指すだけでなく、サイトの品質の長期的な目標のために(誤って終了しないように投票する)正しい行動についてユーザーを教育する必要があります。そして、上記のコメントを指摘しなかった場合、人々が時々そうするので、それは複製として閉じられているかもしれません。
Bernhard Barker

回答:


141

いいえ、ただしPhi(「黄金比」)に基づいています。

161803398 = 1.61803398 * 10^8  φ * 10^8

黄金比の詳細はこちら

そして、ここでカジュアルな数学者のための本当に良い本です

そして、私はこの主張に同意する乱数発生器に関する研究論文を見つけまし。(53ページ参照)


17
Phiに基づく数が種として良い選択をする理由を知っていますか?これをここに要約することは可能でしょうか?
Bernhard Barker

29
@Dukeling定数は1回だけ使用され、着信シードを調整します。私の非常に強い疑いは、数ビットが設定されたシード(おそらく一般的な選択)が(phiの魔法のプロパティの代わりに)乱数ジェネレーターを台無しにしないようにするために、スリーブ番号の何も選択されていないことです。
デビッドアイゼンスタット2014年

7
上記の本の引用を引用するには、Knuthによると、大きいMBIGと小さい(それでも大きい)MSEEDを上記の値に置き換えることができます。ですから、多かれ少なかれ数学的な楽しみです。だから正解は次のとおりです。いいえ。しかし、それはファイに基づいています。
TaW

14
ちょうどその乱数紙を見てみた-この行は少し際立っていた- "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(ページ4)
jcw '16

2
黄金比を使用するより適切な方法は、基数10とは関係のないコードで数字の基数10表現を使用するのではなく、(係数/ファイ)を使用することだと思います。そのページでは、整数Nについて、N / phi-int(N / phi)> = 1 / N / sqrt(5)という値がわかることがわかりませんでした。つまり、N / phi-int(N / phi)の数列を生成した場合でも、最も近いペア間の距離は、間隔内で可能な最大の均一間隔のsqrt(5)の係数内になります(
0..1

62

この数値は、黄金比 1.61803398 * 10 ^ 8から取得されます。マットはこの数字が何であるかについて良い答えを出したので、アルゴリズムについて少しだけ説明します。

これは、このアルゴリズムの特別な番号ではありません。このアルゴリズムは、Knuthの減算乱数ジェネレータアルゴリズムであり、その主なポイントは次のとおりです。

  • 56個の乱数の循環リストを保存する
  • 初期化はリストを埋めるプロセスであり、特定の決定論的アルゴリズムでそれらの値をランダム化します
  • 31離れている2つのインデックスが保持されます
  • 新しい乱数は、2つのインデックスでの2つの値の差です
  • リストに新しい乱数を保存する

発電機は、次の再帰に基づいている:X N =(X N-55 - X N-24)は、n≥0これは部分的ケースであるMOD M、Lagged Fibonacci法:X N =(X N-J @ X N-K)mod m、ここで0 <k <jおよび@は任意の二項演算(減算、加算、xor)です。

このジェネレーターの実装はいくつかあります。Knuthは、彼の著書でFORTRANの実装を提供しています。私は次のコードで次のコメントを見つけました:

パラメータ(MBIG = 1000000000、MSEED = 161803398、MZ = 0、FAC = 1.E-9)

Knuthによると、上記の値の代わりに、大きいMBIG、および小さい(ただし大きい)MSEEDを使用できます。

もう少しここで見つけることができます。これは実際には(Mathによって述べられた)研究論文ではないことに注意してください。

無理数を(使用したい暗号の人々piesqrt(5)の桁ことが推測があるため)、そのような番号が等しい頻度で現れるので、高有するエントロピー。この関連する質問をセキュリティスタック交換で見つけて、そのような数値について詳しく知ることができます。ここに引用があります:

「定数がランダムに選択されている場合、高い確率で、攻撃者がそれを壊すことはできません。」しかし、暗号学者は偏執狂的で、「この定数のセットを使ってみましょう。ランダムに選んだのです」と誰かが言ったとき、懐疑的です。そのため、妥協案として、たとえばπのバイナリ展開などの定数を使用します。いくつかの大きな数のプールからランダムにそれらを選択したという数学的な利点はもはやありませんが、少なくとも妨害行為がなかったと確信することができます。


5
答えは、エントロピーだけでなく、それらの数字が私の袖の数を上回っていないためでもあります。
コールジョンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.