Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
构造方法:
public Random(long seed) //以一个long型的参数作为种子
public Random() //以系统时间的nanoTime作为种子
如果两个Random类的实例是同一个种子创建,对它们以同样的顺序调用,将会返回相同的数字序列,(注意:并不是相同的数值)
结果:
根据以上可以看出r1与r2生成的随机序列是一样的。
生成下一个随机数的算法:
1、只要oldseed相同,那么nextseed就相同
2、每次生成完下一个随机数,会更新种子,所以即使是相同的nextInt(n) 但是得到的值也可能是不一样的(由输出的结果2可以看出)
构造方法:
public Random(long seed) //以一个long型的参数作为种子
public Random() //以系统时间的nanoTime作为种子
如果两个Random类的实例是同一个种子创建,对它们以同样的顺序调用,将会返回相同的数字序列,(注意:并不是相同的数值)
测试如下:
Random r1 = new Random(10);
Random r2 = new Random(10);
System.out.println("结果1=======================");
for(int i=0;i<5;i++){
System.out.println(r1.nextInt()+":"+r2.nextInt());
}
System.out.println("结果2=======================");
for(int i=0;i<5;i++){
System.out.println(r1.nextInt(100)+":"+r2.nextInt(100));
}
结果:
结果1=======================
-1157793070:-1157793070
1913984760:1913984760
1107254586:1107254586
1773446580:1773446580
254270492:254270492
结果2=======================
56:56
97:97
88:88
81:81
14:14
根据以上可以看出r1与r2生成的随机序列是一样的。
生成下一个随机数的算法:
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
由此可以得出:
1、只要oldseed相同,那么nextseed就相同
2、每次生成完下一个随机数,会更新种子,所以即使是相同的nextInt(n) 但是得到的值也可能是不一样的(由输出的结果2可以看出)