课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java里不要随便设置随机种子
  • java里不要随便设置随机种子

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-30

  • 昆明Java培训的老师知道,随机数用的地方比较多,比如加密,混淆计算,我们使用随机数期望获得一个唯一的、不可仿造的数字,以避免产生相同的业务数据造成混乱。在Java项目中通常是通过Math.random方法和Random类来获得随机 的,我们来看一段代码:

    1 import java.util.Random;

    2

    3 public class Client30 {

    4    public static void main(String[] args) {

    5        Random r = new Random();

    6        for(int i=1; i<=4; i++){

    7            System.out.println("第"+i+"次:"+r.nextInt());

    8            

    9        }

    10    }

    11 }

    代码很简单,我们一般都是这样获得随机数的,运行此程序可知,三次打印,的随机数都不相同,即使多次运行结果也不同,这也正是我们想要随机数的原因,我们再来看看下面的程序:

    1 public class Client30 {

    2    public static void main(String[] args) {

    3        Random r = new Random(1000);

    4        for(int i=1; i<=4; i++){

    5            System.out.println("第"+i+"次:"+r.nextInt());

    6            

    7        }

    8    }

    9 }

    上面使用了Random的有参构造,运行结果如下:

    第1次:-1244746321

    第2次:1060493871

    第3次:-1826063944

    第4次:1976922248

    计算机不同输出的随机数也不同,但是有一点是相同的:在同一台机器上,甭管运行多少次,所打印的随机数都是相同的,也就是说第一次运行,会打印出这几个随机数,第二次运行还是打印出这三个随机数,只要是在同一台 器上,就永远都会打印出相同的随机数,似乎随机数不随机了,问题何在?

    那是因为产生的随机数的种子被固定了,在Java中,随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个原则:

    种子不同,产生不同的随机数

    种子相同,即使实例不同也产生相同的随机数

    看完上面两个规则,我们再来看这个例子,会发现问题就出在有参构造上,Random类的默认种子(无参构造)是System.nonoTime()的返回值(JDK1.5版本以前默认种子是System.currentTimeMillis()的返回值),注意这个值是距离某一个固定时间点的纳 秒数,不同的操作系统和硬件有不同的固定时间点,也就是说不同的操作系统其纳秒值是不同的,而同一个操作系统纳秒值也会不同,随机数自然也就不同了.(顺便说下,System.nonoTime不能用于计算日期,那是因为"固定"的时间是 确定的,纳秒值甚至可能是负值,这点与System.currentTiemMillis不同)。

    new Random(1000)显示的设置了随机种子为1000,运行多次,虽然实例不同,但都会获得相同的四个随机数,所以,除非必要,否则不要设置随机种子。

    顺便提一下,在Java中有两种方法可以获得不同的随机数:通过,java.util.Random类获得随机数的原理和Math.random方法相同,Math.random方法也是通过生成一个Random类的实例,然后委托nextDouble()方法的,两者殊途同归,没有差别。

    昆明Java培训的老师提醒大家注意:若非必要,不要设置随机数种子。

    推荐文章

上一篇:java程序:优先选择基本类型

下一篇:在接口中不要存在实现代码

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56