提高你的Java代码质量吧:不要随便设置随机种子

一、分析 

在加密、混淆数据等地方,我们经常期望获得一个唯一的、不可仿造的数字,以避免产生相同的业务数据造成混乱 

在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工场”微信服务号 ,时刻关注我们的最新的技术讯息! (甭客气!尽情的扫描或者长按!)


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值