有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    系统的javadoc。nanoTime()表示:

    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的javadoc说:

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

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

    因此,您所有的问题都可以通过阅读javadoc来回答