2017-02-16 5 views
9

乱数に関する大きな学校プロジェクトに取り組んでいますが、Math.random()の期間を見つけることができません。私はバージョン7.0.800.15がインストールされており、私はWindows 10のコンピュータを使っています。こうして期間が経過したであろう、アレイ内Java Math.random period

double num = Math.random(); 

し、それは再び行で同じ値が見つかるまでループし、しかし:私は最初の値を保存し、簡単なプログラムと期間を決定しようとしましたその結果、期間が長すぎます。

私の質問は:私のバージョンでMath.random()の期間は何ですか? または、単純なプログラムを使用して期間を特定する方法はありますか?

編集:JavaScriptの程度ページを指すソースを奪った、それは関係ありませんでした

+0

期間によってはどういう意味ですか?同じ結果が返されるまでのコール数? – Izruo

+0

JavaまたはJavascriptに関するご質問はありますか?リンクはJavascriptについて話しています。 – Kayaman

+1

@Izruo同じ数字が繰り返されるまでの呼び出しの回数は、同じ数字が繰り返されるまで意味します。 –

答えて

5

JavaのMath.Randomは、2^48の係数を持つ線形合同法を使用しています。十分に選択されたパラメータを有するそのような擬似乱数発生器の周期は、弾性率に等しい。 Javaのパラメータは健全に選択されているようですので、実際には2^48です。

源:linear congruential generatorhttps://en.wikipedia.org/wiki/Linear_congruential_generatorhttp://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml#.WKX-gRJ97dQ

4

ウィキは、Java(java.util.Randomの)は2 の弾性率を有するものとして引用します。 これはおそらく期間ですが、これらのタイプのランダムジェネレーターについてもっと詳しく知る必要があるかもしれません。

この質問(How good is java.util.Random?)も同じ期間を引用しています。

2

もう少し一般的な乱数ジェネレータを書き留めて、その期間を特定するプログラムを作成するだけで、Birthday ParadoxGambler's Fallacyに注意してください。 xの値を生成した場合、次の数字は他の数字と同じようにxであり、複製する可能性がある前に生成する必要がある数字の数は実際には驚くほど小さくなります原則として、期間の終わりになる前にいくつかの重複が見え始めます。これは、これをテストするプログラムの作成を複雑にします)。

sqrt(2m * p(n))p(n)によって最大50%かそこらcan be approximated確率の重複の可能性は、あなたが計算しようとしているとmは選択肢の数である確率です。 32ビット整数の場合、sqrt(2m * p(n)) = sqrt(2 * 2^32 * 0.5) = sqrt(2^32) = 65,536。あなたはそれを持っています - 一度65,536の数字を生成すると、あなたは複製を生成した確率は約50-50です。

あなたが2^32 + 1値を生成したら、Pigeonhole Principleはあなたが少なくとも 1の重複(あなたは32ビットの数値を生成していることを、もちろん、と仮定)を生成している必要があることを指定します。

this questionあなたは乱数を数えて一意にすることができるかどうかについては、this questionをご覧ください。

関連する問題