`
polim
  • 浏览: 104849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Random

阅读更多
Java Random类可以获取随机数,请看如下代码:
public class RandomTest {

public static void main(String[] args) {
RandomTest.getRandom();
System.out.println("---------------------------");
RandomTest.notGetRandom();
}

/**
* 执行n次返回数据不同
*/
public static void getRandom(){
Random r = new Random();
for(int i=1;i<4;i++){
System.out.println("第"+i+"次结果为:"+r.nextInt());
}
}

/**
* 相同的机器执行多次返回的内容是一致的
*/
public static void notGetRandom(){
Random r = new Random(1000);
for(int i=1;i<4;i++){
System.out.println("第"+i+"次结果为:"+r.nextInt());
}
}
}

执行多次结果如下:
执行第一次输出结果为:
第1次结果为:-255222630
第2次结果为:1123609859
第3次结果为:-1656551992
---------------------------
第1次结果为:-1244746321
第2次结果为:1060493871
第3次结果为:-1826063944


执行第二次输出结果为:
第1次结果为:-552545679
第2次结果为:1866864931
第3次结果为:-1883987848
---------------------------
第1次结果为:-1244746321
第2次结果为:1060493871
第3次结果为:-1826063944

发现方法notGetRandom在相同的机器上执行n次返回的结果都是一样的。

具体原因如下:
random 源码中定义如下:
public Random() { this(++seedUniquifier + System.nanoTime()); }
private static volatile long seedUniquifier = 8682522807148012L;
每次构造一个Random对象时是以当前时间纳秒数加参数获得。


public Random(long seed) {
        this.seed = new AtomicLong(0L);
        setSeed(seed);
  }
而Random(long seed)构造方法是以固定的种子seed获得。所以出现前面demo的情况就不言而明了。
Java中Random遵循2个规则
1、种子不同产生不同的随机数
2、种子相同即使实例不同也产生相同的随机数
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics