Javaプログラムを書くときは、Random
クラスのsetSeed
を使用します。なぜこの方法を使うのでしょうか?Random.setSeedを使用することの重要性は何ですか?
setSeed
を使用せずにRandom
を使用することはできませんか? setSeed
を使用する主な目的は何ですか?
Javaプログラムを書くときは、Random
クラスのsetSeed
を使用します。なぜこの方法を使うのでしょうか?Random.setSeedを使用することの重要性は何ですか?
setSeed
を使用せずにRandom
を使用することはできませんか? setSeed
を使用する主な目的は何ですか?
これを使用すると、将来のプログラムの結果をに再現できるようになります。
例として、データベースの各行に対してランダム変数を計算したかったのです。プログラムを再現可能にしたかったのですが、行間のランダム性が必要でした。これを行うために、乱数シードを各行の主キーに設定します。こうすると、プログラムを再実行したときも同じ結果が得られましたが、行間ではランダム変数は擬似ランダムでした。
乱数ジェネレータを初期化するためにシードが使用されます。シードは、一連の乱数を生成するための開始点を設定するために使用されます。シードは、ジェネレータをランダムな開始点に設定します。ユニークシードは、ユニークな乱数シーケンスを返します。
Thisが参考になる場合があります。
確定的乱数生成器DRBGとも呼ばれる擬似乱数生成器(PRNG)は、乱数の性質を近似する数列を生成するアルゴリズムです。 シーケンスは真のランダムシードを含むPRNGの状態と呼ばれる比較的小さな初期値セットによって完全に決定されるという点で本当にランダムではありません。
ありがとうたくさんの「The New Idiot」 – nilashan
私はこれを行うための2つの理由を見ることができます:
あなたが再現可能な乱数ストリームを作成することができます。与えられたシードに対して、同じ結果が(同じ)nextX
メソッドへの連続コールから返されます。
ランダムの2つのインスタンスが同じシードで作成、および方法の同じシーケンスが呼び出すされている場合は、それぞれのために作られ、彼らは
番号の同一の配列を生成して返しますあなたは感じます何らかの理由で、あなたのシードがデフォルトのソースより高品質である(私はあなたのPC上の現在の時刻から推測されていると推測しています)。
特定のシードは、常に「ランダム」な番号の同じシーケンスを与えます。したがってランダムには2^64の異なるシーケンスしかありません! setSeed
に加えて、シードを持つコンストラクタを使用することもできます。 がでない場合、シードはコンピュータの時計を使用して実際にランダムなシードを選択します。通常の場合はそう
には、特定の種、コンストラクタRandom()
となしsetSeed
を使用していません。 特に、setSeed(System.currentTimeMillis())
をお控えください。
データ依存のデバッグの場合、同じ擬似ランダムデータを繰り返したい場合は、特定のシードを使用します。
シードの範囲が広いため、特定のシード/シーケンスが認識され、後続の数字が予測されるかどうかを心配する必要はありません。
デフォルトのコンストラクタは、new Random()
の何千もの話をすると、コストのかかるOS機能であるSystem.nanoTime()
(適切にマングルされている)を使用します。
Joop Eggenに感謝します! – nilashan
他のいくつかは再現性について述べている。再現性はデバッグの中心ですが、バグが発生した状況を再現できる必要があります。
再現性のもう1つの重要な用途は、いくつかの見積もりの変動を減らすためにいくつかの統計ゲームをプレイできることです。詳細については、Wikipedia's Variance Reduction articleを参照してください。直感は次のとおりです。銀行や食料品店の2つの異なるレイアウトを検討しているとします。両方をビルドしてどちらがうまくいくかを見ることはできないので、シミュレーションを使用します。あなたは待ち行列理論から、顧客が経験するラインと遅延のサイズは部分的にレイアウトによるものであることも分かっていますが、到着時間や需要の変動などの理由もあります。モデルを完全に独立して実行し、レイアウト2よりもレイアウト1の方が大きい場合は、レイアウトが原因である可能性があります。レイアウト1が発生したために顧客が増えたり、抽選の運のために。しかし、両方のシステムが同じ時間に到着し、同じトランザクション要求を持つまったく同じ顧客セットを使用する場合、それは「より公平な」比較です。あなたが観察した違いは、レイアウトのせいかもしれません。両方のシステムでランダム性を再現することでこれを達成できます。同じシードを使用し、両方のシステムで同じ乱数が同じ目的で使用されるように同期します。
あなたは大歓迎です! – pjs
ああ、また、ガイガーカウンターが横たわっていると、ランダムな種を本当にランダムなものに設定することができます。シードを1秒ごとに設定することもできますが、しばしば真のランダムなソースを測定してから、再度リセットすることができます。 – Owen
ありがとうオーウェン!! – nilashan