gpt4 book ai didi

Java 的随机数生成器——为每个随机数创建一个新的随机对象*功能上*不正确吗?

转载 作者:搜寻专家 更新时间:2023-10-31 20:10:45 24 4
gpt4 key购买 nike

下面的代码是否有可能将某些内容打印到控制台?

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 的实现。

最佳答案

System.nanoTime() 的 javadoc 说:

This method provides nanosecond precision, but not necessarily nanosecond resolution (that is, how frequently the value changes) - no guarantees are made except that the resolution is at least as good as that of currentTimeMillis().

所以是的,两次连续调用有可能产生相同的值。

虽然这与第二部分无关:纳米时间不用于播种新的随机数。随机构造函数 javadoc 说:

Creates a new random number generator. This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.

因此,连续创建的两个 Random 不太可能具有相同的种子,从而产生相同的随机数。

这并不意味着每次需要时都重新创建一个 Random 是个好主意。 Random 的 javadoc 说:

An instance of this class is used to generate a stream of pseudorandom numbers

因此您可以重复使用同一个实例:它会更快,并且会产生随机数流。

您所有的问题都可以通过简单地阅读 javadoc 来回答。

关于Java 的随机数生成器——为每个随机数创建一个新的随机对象*功能上*不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30136872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com