不是说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 对象的那行语句放到循环外面去。