2

2つの完全に別個のメカニック(攻撃ロールと表面的なランダムアニメーションなど)のRandom()。nextInt(int)整数を取得する場合、メカニックごとに別々のRandom()インスタンスを使用する理由はありますか?たとえば、各整備士のランダム値をより均等に分散させるのに役立つでしょうか?

-

同様に、ランダムな値の均等な分散が重要である継続的なゲームでは、Random()のインスタンスまたはシードを保存されたゲームデータとともに保存し、ゲームがロードされたときに中断したところから再開する理由がありますか? -毎回新しいインスタンスを作成するのではなく?

たとえば、プレーヤーが各ターンで幸運または不幸になる可能性があるターンベースのゲームでは、ゲームのロード時に新しいRandom()インスタンスを作成すると、プレーヤーが異常に幸運または不幸になる状況が発生する可能性がありますか?

-

(注:「新しいインスタンスの作成」とは、シードを指定せずに「Random random = new Random()」のみを使用することを意味します。)

ありがとう!

4

1 に答える 1

5

いいえ、理由はありません。同じインスタンスを使用します。

いくつかの例外を除いて:

  1. パターンの予測可能性望まれます。たとえば、特定の「ソリティアゲーム番号」をシードしたり、「同じランダムイベントが発生することを確認したりする」(たとえば、「不正行為」の保存/読み込みを停止する)には、内部状態がないため、PRNGの再現性を利用するために追加の作業が必要になる場合があります。露出。これはビジネスルールです。
  2. スレッドが使用され、同じランダムインスタンスを使用するとパフォーマンスの問題が発生します。(ランダムはJavaでスレッドセーフです、私は以前にミスポークしました。)

同じシードの問題は、PRNGシーケンスが同じように開始されることです(したがって、既知であるか、通常は同じ[衝突]シーケンスと「ランダム性の欠如」を引き起こします)。ただし、シーケンスのランダム性の品質は影響を受けません。

余談ですが、ありがたいことに、Javaにはかなり優れたデフォルトのランダムコンストラクタがあります。

新しい乱数ジェネレーターを作成します。このコンストラクターは、乱数ジェネレーターのシードを、このコンストラクターの他の呼び出しとは異なる可能性が非常に高い値に設定します。

JDK 6では、次のように実装されます。

this(++seedUniquifier + System.nanoTime());

(もちろん、上記の実装でも縮退シナリオを想像/考案することは可能です...)

ハッピーコーディング。

于 2012-06-26T03:23:29.260 に答える