9

友人がプログラムを実行するたびに同じ数を取得し続けたとき、私は Java の乱数ジェネレーターを友人に説明しようとしていました。私は同じものの独自のより単純なバージョンを作成しましたが、私もプログラムを実行するたびに彼が取得したのとまったく同じ数値を取得しています.

私は何を間違っていますか?

import java.util.*;

public class TestCode{
   public static void main(String[] args){
       int sum = 0;
       Random rand = new Random(100);
       for(int x = 0; x < 100; x++){
           int num = (rand.nextInt(100)) + 1;
           sum += num;
           System.out.println("Random number:" + num);
       }
       //value never changes with repeated program executions.
       System.out.println("Sum: " + sum); 
   }

}

100のうち最後の5つの数字は次のとおりです。

40
60
27
56
53
4

4 に答える 4

23

乱数発生器に定数値をシードしました100。これは決定論的であるため、実行するたびに同じ値が生成されます。

でシードすることを選択した理由はわかりません100が、シード値は、生成される値の範囲とは関係ありません (これは、nextInt既に持っている への呼び出しなど、他の手段によって制御されます)。

毎回異なる値を取得するには、Randomコンストラクターを引数なしで使用します。これは、システム時間を使用してランダム ジェネレーターをシードします。

Randomパラメーターなしのコンストラクターの Javadoc からの引用:

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

パラメーターなしのRandomコンストラクターで実際のコードを引用する:

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}
于 2013-04-29T23:45:57.280 に答える
2

これ:

   Random rand = new Random(100);

プログラムを起動するたびに、乱数ジェネレーターに同じシード (100) を与えています。からの出力のようなものSystem.currentTimeMillis()を与えてください。これにより、呼び出しごとに異なる番号が得られるはずです。

于 2013-04-29T23:46:45.317 に答える
1

乱数ジェネレーターは、実際には疑似乱数にすぎません。つまり、決定論的な手段を使用して、特定の統計的基準を考慮してランダムに見えるシーケンスを生成します。

Random(long seed)コンストラクターを使用すると、疑似乱数のシーケンスを決定するシードを渡すことができます。

于 2013-04-29T23:47:31.077 に答える