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

时间:2015-05-09 06:38:15

标签: java random

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

Activity

那怎么样:

      context.fillStyle = 'white';
      context.fillRect(0, 0, 400, 320);

      context.beginPath();
      context.moveTo(x0, y0);
      context.lineTo(x1, y1);
      context.lineTo(x2, y2);
      context.lineTo(x3, y3);
      context.strokeStyle = 'black';
      context.stroke();

      context.beginPath();
      context.arc(x1, y1, radius, 0, 2*Math.PI, true);
      context.arc(x2, y2, radius, 0, 2*Math.PI, true);
      context.arc(x3, y3, radius, 0, 2*Math.PI, true);
      context.fillStyle = 'blue';
      context.fill();

r1和r2具有相同的种子?

提出同样问题的其他方式是:以下代码是否正确

while (true) {
    long t1 = System.nanoTime();
    long t2 = System.nanoTime();
    if (t1 == t2)
        System.out.println(t1 == t2);
}

编辑:新的Random()的可能实现是:

Random r1 = new Random();
Random r2 = new Random();

事实上,这正是HotSpot的实施。

1 个答案:

答案 0 :(得分:3)

System.nanoTime()的javadoc说:

  

此方法提供纳秒级精度,但不一定是纳秒级分辨率(即,值的变化频率) - 除了分辨率至少与currentTimeMillis()的分辨率一样好之外,不做任何保证。

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

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

  

创建一个新的随机数生成器。此构造函数将随机数生成器的种子设置为非常可能与此构造函数的任何其他调用不同的值。

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

这并不意味着每次需要时都会重新创建一个随机数。 Random的javadoc说:

  

此类的实例用于生成伪随机数流

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

所有问题都可以通过阅读javadoc来解答。