5

我正在编写一个带有十进制字段的类构造函数,它需要由一个随机值初始化。只有一个小领域,我需要创建新Random对象。首先它看起来很麻烦,其次可能会出现很多相等的值,以防在一个时间片中创建很多对象(new Random()等于new Random(System.currentTimeMillis()),并且相等的 timeMillis 需要相等的随机值)。

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

4

3 回答 3

9

new Random() 等同于 new Random(System.currentTimeMillis())

不,这不对。在最近的 JDK 中,它是new Random(seedUniquifier() ^ System.nanoTime()); seedUniquifier() 基于在 static 上运行线性同余生成器的地方AtomicLong。因此,Random根据需要创建对象实际上是完全安全的。

当然,您始终可以拥有一个private static Random字段并在构造函数中使用它。

于 2012-04-11T20:34:48.337 回答
6

您正在寻找Math.random。这是一个静态方法,Random它在第一次调用时隐式初始化一个新对象,然后再使用该对象。因此,您可以获得在所有静态字段初始化之间共享单个Random对象的好处,而无需Random自己管理对象。

于 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 回答