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