获取随机值而不创建“Random”对象

时间:2012-04-11 20:24:03

标签: java

我正在编写一个带有十进制字段的类构造函数,需要通过随机值进行初始化。只需一个小字段,我需要创建新的Random对象。首先它看起来很麻烦,而在第二个地方可能出现很多相等的值,如果在一个时间片中创建了很多对象(new Random()对于new Random(System.currentTimeMillis())是真实的,并且等时间米利斯需要相等的随机值。)

避免这种情况的最佳方法是什么?

3 个答案:

答案 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那样随意。基本上根据您的需要调整您的选择。