当前位置: 代码迷 >> J2SE >> new Random()和new Random(System.currentTimeMillis())两个构造方法到底是否等同?该如何解决
  详细解决方案

new Random()和new Random(System.currentTimeMillis())两个构造方法到底是否等同?该如何解决

热度:475   发布时间:2016-04-24 01:26:36.0
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 对象的那行语句放到循环外面去。
  相关解决方案