日期:2014-05-20  浏览次数:21163 次

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

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

Java code

//如下代码产生相同的随机数
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());
}



------解决方案--------------------
非要解释吗??
好吧,我错了,我确实没好好研究过,但是如果你好好看过源码,你就发现问题了。
public Random() { this(++seedUniquifier + System.nanoTime()); }
private static volatile long seedUniquifier = 8682522807148012L;
每次new 一个Random ,++seedUniquifier,而seedUniquifier在内存中只加载一次(因为是static),所以每次的种子是不一样的,所以得到不同的结果。
------解决方案--------------------
你把创建 Random 对象的那行语句放到循环外面去。