Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。
1、Random对象的生成
Random类包含两个构造方法:
public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
public Random(long seed)
再次强调:==种子数只是随机算法的起源数字,和生成的随机数字的区间无关==。
2、Random类中的常用方法
public boolean nextBoolean()
生成一个随机的boolean值,生成true和false的值几率相等
public double nextDouble()
生成一个随机的double值,数值介于[0,1.0)之间,就是java.math.random
public int nextInt()
生成一个随机的int值,该值介于int的区间,从-2的31次方到2的31次方之间
public int nextInt(int n)
生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值
public void setSeed(long seed)
重新设置Random对象中的种子数。设置完种子数以后的Random对象和相同种子数使用new关键字创建出的Random对象相同。
它有一个几率实现的设置,有兴趣的可以搜搜
3、其它问题
相同种子数Random对象问题
1
2
3
4
5
6
7
8public static void main(String[] args) {
Random r1 = new Random();
Random r2 = new Random();
for (int i = 0; i < 3; i++) {
System.out.println(r1.nextInt());
System.out.println(r2.nextInt());
}
}该代码中,对象r1和r2使用的种子数都是10,则这两个对象相同次数生成的随机数是完全相同的。如果想避免出现随机数字相同的情况,则需要注意,无论项目中需要生成多少个随机数字,都只使用一个Random对象即可。
关于Math类中的random方法
其实在Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。
通过阅读Math类的源代码可以发现,Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。只是random方法的调用比较简单,所以很多程序员都习惯使用Math类的random方法来生成随机数字。
引用原文:https://www.cnblogs.com/Fskjb/archive/2009/08/29/1556417.html