不是说new Random()构造方法使用的种子是当前System.currentTimeMillis()么?可是为什么如下第一段代码产生的随机数相同,而第二段代码产生的随机数却不同呢?

new Random()和new Random(System.currentTimeMillis())这两个构造方法到底是否等同?

//如下代码产生相同的随机数
for (int i = 0; i < 100; i++)
{
    Random r = new Random(System.currentTimeMillis());
    System.out.println(r.nextInt());
}

//如下代码产生不同的随机数
for (int i = 0; i < 100; i++)
{
    Random r = new Random();
    System.out.println(r.nextInt());
}

1个回答

如果你好好看过源码,你就发现问题了。

public Random() { this(++seedUniquifier + System.nanoTime()); }
  private static volatile long seedUniquifier = 8682522807148012L;

每次new 一个Random ,++seedUniquifier,而seedUniquifier在内存中只加载一次(因为是static),所以每次的种子是不一样的,所以得到不同的结果。