重複チェック - java 配列 ランダム




種を使用したJavaの乱数 (5)

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

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

    return num;
}

私が種を与えて100個の数字を生成しようとするたびに、それらはすべて同じです。
これをどうすれば解決できますか?


1つのシードを使って複数の数値を生成したい場合は、次のようなことができます:

public double[] GenerateNumbers(long seed, int amount) {
    double[] randomList = new double[amount];
    for (int i=0;i<amount;i++) {
        Random generator = new Random(seed);
        randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000);
        seed--;
    }
    return randomList;
}

同じシードを使用する場合は、同じリストが表示されます。


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

疑似乱数生成と種を理解するにはこれをチェックしてください:

擬似乱数生成器

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

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

あなたのコードはおそらくこのようになるはずです:

private Random generator = new Random();
double randomGenerator() {
    return generator.nextDouble()*0.5;
}

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


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

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ラップするとは思わない。 それを使用しているあなたのクラスに入れてください。


簡単な方法は以下を使用することです:

Random rand = new Random(System.currentTimeMillis());

これは、 Randomを生成するための最良の方法です。





seed