5

ランダム値で初期化する必要がある小数フィールドを持つクラス コンストラクターを作成しています。たった 1 つの小さなフィールドで、新しいRandomオブジェクトを作成する必要があります。最初は面倒に見えますが、2 つ目は、1 つのタイム スライスで多数のオブジェクトを作成する場合に、多数の等しい値が発生する可能性があります (new Random()は euqalnew Random(System.currentTimeMillis())であり、等しい timeMillis は等しいランダム値を伴います)。

これを回避する最善の方法は何ですか?

4

3 に答える 3

9

new Random() は new Random(System.currentTimeMillis()) と同等です

いいえ、ちがいます。最近の JDK ではnew Random(seedUniquifier() ^ System.nanoTime()); 、 static で線形合同ジェネレーターを実行することに基づいて、 seedUniquifier() が行われていますAtomicLongRandomしたがって、必要に応じてオブジェクトを作成することは、実際には完全に安全です。

もちろん、いつでもprivate static Randomフィールドを持ち、それをコンストラクターで使用できます。

于 2012-04-11T20:34:48.337 に答える
6

You're looking for Math.random. This is a static method that implicitly initializes a new Random object the first time it is called, and then uses that object thereafter. So you get the benefits of sharing a single Random object between all the static field initializations, without having to manage a Random object yourself.

于 2012-04-11T20:25:29.287 に答える
2

文書化されているように、Java 7 を使用しており、Randomスレッドセーフです。

java.util.Random のインスタンスはスレッドセーフです。ただし、スレッド間で同じ java.util.Random インスタンスを同時に使用すると、競合が発生し、パフォーマンスが低下する可能性があります。マルチスレッド設計では代わりに ThreadLocalRandom を使用することを検討してください。

したがって、次を使用できます。

private static final Random random = new Random();

...または、ThreadLocalRandomこれを多くのスレッドから使​​用する場合に使用します。もちろん、それはまだランダムではありませんSecureRandom。基本的には、必要に応じて選択を調整してください。

于 2012-04-11T20:43:53.910 に答える