我正在编写一个带有十进制字段的类构造函数,需要通过随机值进行初始化。只需一个小字段,我需要创建新的Random
对象。首先它看起来很麻烦,而在第二个地方可能出现很多相等的值,如果在一个时间片中创建了很多对象(new Random()
对于new Random(System.currentTimeMillis())
是真实的,并且等时间米利斯需要相等的随机值。)
避免这种情况的最佳方法是什么?
答案 0 :(得分:9)
new Random()是新的Random(System.currentTimeMillis())
不,不是。在最近的JDK中,它是new Random(seedUniquifier() ^ System.nanoTime());
其中seedUniquifier()基于在静态AtomicLong
上运行线性同余生成器。因此,根据需要创建Random
对象实际上是非常安全的。
当然,您始终可以拥有private static Random
字段并在构造函数中使用它。
答案 1 :(得分:6)
您正在寻找Math.random。这是一个静态方法,它在第一次调用时隐式初始化一个新的Random
对象,然后再使用该对象。因此,您可以在所有静态字段初始化之间共享单个Random
对象,而无需自己管理Random
对象。
答案 2 :(得分:2)
您是否正在使用Java 7,Random
是线程安全的,如下所示:
java.util.Random的实例是线程安全的。但是,跨线程并发使用相同的java.util.Random实例可能会遇到争用并因此导致性能不佳。请考虑在多线程设计中使用ThreadLocalRandom。
所以你可以使用:
private static final Random random = new Random();
...或者如果你要从许多线程中使用它,请使用ThreadLocalRandom
。当然,它仍然不会像SecureRandom
那样随意。基本上根据您的需要调整您的选择。