一、分析
在加密、混淆数据等地方,我们经常期望获得一个唯一的、不可仿造的数字,以避免产生相同的业务数据造成混乱。
在Java项目中,通常是通过Math.random方法和Random类类获得随机数的。这两种方式获取随机数的原理是相同的,Math.random方法也是通过生成一个Random类的实例,然后委托newxDouble方法,没有差别。
在Java中,随机数的产生取决于种子,随机数和种子之间的关系遵循以下两个规则:
1.种子不同,产生不同的随机数。
2.种子相同,即使实例不同也产生相同的随机数。
Random类的默认种子(无参构造)是System.nanoTime()的返回值(JDK1.5版本以前默认种子是System.currentTimeMillis()的返回值),这个值是距离某一个固定时间点的纳秒数,不同操作系统和硬件有不同的固定时间点,也就是不同的操作系统纳秒值是不同的,而同一操作系统的纳秒值也会不同,随机数自然也就不同了。
二、场景
代码一:
public class Client{
public static void main(String[] args){
Random r = new Random();
for(int i = 1; i < 4; i++){
System.out.println("第" + i + "次:" + r.nextInt());
}
}
}
代码二:
public class Client{
public static void main(String[] args){
Random r = new Random(1000);
for(int i = 1; i < 4; i++){
System.out.println("第" + i + "次:" + r.nextInt());
}
}
}
代码一:三次输出的随机数不同,多次运行结果也不同
代码二:三次输出的随机数不同,但无论运行多少次结果都一样
从上面的分析并不难解释这个问题。
三、建议
若非必要,不要设置随机数种子。
新技术,新未来!欢迎大家关注
“1024工场”微信服务号
,时刻关注我们的最新的技术讯息!
(甭客气!尽情的扫描或者长按!)