1. ホーム
  2. java

[解決済み] シードを使用したJava乱数

2022-03-04 04:28:09

質問

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

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

    return num;
}

種を与えて100個の数字を生成しようとすると、毎回すべて同じ数字になる。
どうすれば直るのでしょうか?

解決方法は?

同じシードを与えているのであれば、それは正常なことです。これはテストを可能にする重要な機能です。

擬似乱数生成とシードについて理解するために、こちらをご覧ください。

疑似乱数発生器

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

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

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

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