3

2 つの整数の間で乱数を生成したい。私の場合、数字は他の条件を満たさなければなりません。generator.nextInt(x)新しい数が条件を満たさない場合は、ループに入れてシードを再度設定します。

System.currentTimeMillis()生成される数は、シードとして使用した場合のループの反復回数と同じです。に置き換えSystem.currentTimeMillis()ますSystem.nanoTime()。前回よりもはるかに良い結果。

シードを設定するためのより良い方法はありますか?

4

3 に答える 3

11

Randomパラメータを取らないコンストラクタを使用できます。System.nanoTime()そのコンストラクターは、既にに基づいてシードを初期化します。そのコンストラクターを呼び出すたびに、シードは異なります。

通常Random、ランダムなデータの繰り返し可能なシーケンスが必要な場合にのみシードします (それらは決定的です)。

いずれにせよ、nextIntいつでも (または任意のnextXyz方法で) 呼び出しを続けて、すべての番号を再シードすることなく、より多くの乱数を取得し続けることができます。

Java の乱数は疑似乱数です。次の乱数を生成するために使用されるシードが必要です。

于 2013-06-19T21:33:59.107 に答える
4

System.currentTimeMillis() を繰り返し使用する場合、実際にはそれほど頻繁に変更されることはありません。つまり、せいぜいミリ秒に 1 回です。System.nanoTime() を使用すると、マイクロ秒ごとに変化する可能性があります。

シーケンスはランダムであると想定されているため、シードをリセットする必要はないと思います。代わりに乱数を選び続けてください。

于 2013-06-19T21:38:05.867 に答える
1

再度播種する必要はありません。を行うgenerator.nexInt(x)たびに、新しい乱数が得られます。つまり、

0 <= 乱数 < x。

于 2013-06-19T21:35:06.473 に答える