52

これは、シードを引数として使用して乱数を生成する私のコードです。

double randomGenerator(long seed) {
    Random generator = new Random(seed);
    double num = generator.nextDouble() * (0.5);

    return num;
}

シードを与えて 100 個の数字を生成しようとするたびに、それらはすべて同じです。
どうすればこれを修正できますか?

4

7 に答える 7

84

同じ種を与えている場合、それは正常です。これは、テストを可能にする重要な機能です。

これをチェックして、疑似乱数の生成とシードを理解してください。

疑似乱数ジェネレーター

決定論的ランダム ビット ジェネレーター DRBG とも呼ばれる疑似乱数ジェネレーター (PRNG) は、乱数の特性を近似する一連の数値を生成するためのアルゴリズムです。シーケンスは、完全にランダムなシードを含む PRNG の状態と呼ばれる比較的小さな初期値のセットによって完全に決定されるという点で、完全にランダムではありません。

異なるシーケンスが必要な場合 (アルゴリズムをチューニングまたはデバッグしない場合の通常のケース)、nanoTime を使用して毎回異なるシードを取得しようとするゼロ引数コンストラクターを呼び出す必要があります。もちろん、このRandomインスタンスはメソッドの外部に保持する必要があります。

あなたのコードはおそらく次のようになります。

private Random generator = new Random();
double randomGenerator() {
    return generator.nextDouble()*0.5;
}
于 2012-09-17T11:38:56.580 に答える
11

メソッドスコープで新しいランダムを作成するべきではありません。それをクラスメンバーにします:

public class Foo {
   private Random random 

   public Foo() {
       this(System.currentTimeMillis());
   }

   public Foo(long seed) {
       this.random = new Random(seed);
   }

   public synchronized double getNext() {
        return generator.nextDouble();
   }
}

これは単なる例です。Randomこのようにラッピングしても価値はないと思います。それを使用しているあなたのクラスに入れてください。

于 2012-09-17T11:44:25.480 に答える
7

これがPseudo -RNGの原理です。数字は本当にランダムではありません。それらは決定論的アルゴリズムを使用して生成されますが、シードに応じて、生成される数値のシーケンスは異なります。常に同じシードを使用するため、常に同じシーケンスが得られます。

于 2012-09-17T11:38:47.513 に答える
2

問題は、乱数発生器を再度シードすることです。シードするたびに、乱数ジェネレーターの初期状態がリセットされ、生成する最初の乱数が初期状態の後の最初の乱数になります。

于 2012-09-17T11:38:56.343 に答える