Java的随机数生成器正在为每个随机数创建一个新的随机对象*功能*不正确?
下面的代码是否有可能打印到控制台上
while (true) {
long t1 = System.nanoTime();
long t2 = System.nanoTime();
if (t1 == t2)
System.out.println(t1 == t2);
}
那么:
Random r1 = new Random();
Random r2 = new Random();
r1和r2有相同的种子
问同样问题的另一种方式是:下面的代码位正确吗
// generate k random integers
int[] random_numbers = new int[k];
for (int i = 0; i < k; ++i) {
Random r = new Random();
random_numbers[i] = r.nextInt();
}
编辑:new Random()的一个可能实现是:
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
事实上,这正是HotSpot的实现
# 1 楼答案
系统的javadoc。nanoTime()表示:
所以,是的,有可能连续两次调用产生相同的值
不过,这与第二部分无关:纳米时间不是用来播种新的随机数的。随机构造器javadoc说:
所以,连续创建的两个随机数不太可能有相同的种子,从而产生相同的随机数
但这并不意味着每次你需要一个随机变量时就重新创建一个随机变量是个好主意。Random的javadoc说:
所以你可以重复使用同一个实例:它会更快,并且会产生一个随机数流
因此,您所有的问题都可以通过阅读javadoc来回答