关于random()的知识

2017-10-15  本文已影响0人  carway

最近在看到《Java编程思想》,看到一段话:用于随机数生成器的初始化值,随机数生成器对于特定的种子值总是产生相同的随机序列。
一开始,对这句话不太理解。所以查了一下关于random()方法的内容。


中文版.png
英文原文.png

Java中Random也称为伪随机函数。

Random rand = new Random(47);  
int i = rand.nextInt(100);  

这段代码就是以47做为种子,生成0-100的随机数

伪随机数

对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。
一般地,我们使用同系统时间有关的参数作为随机种子。

Random对象的生成

Random类包含两个构造方法,下面依次进行介绍:
(1)public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。

    private static volatile long seedUniquifier = 8682522807148012L;  
    public Random() {
         this(++seedUniquifier + System.nanoTime());
    }  

(2)public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。

Random r = new Random(10);  

切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关!

随机种子对结果的影响

(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定
选取随机种子为47,随机数最大值为20.
下面代码运行10次的结果总是为18.

public static void main(String[] args) {  
        for (int i = 0; i < 10; i++) {  
            Random rand = new Random(47);  
            int j = rand.nextInt(20);  
            System.out.println(j);  
        }  
    }  

(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18

public static void main(String[] args) {  
        for (int i = 0; i < 10; i++) {  
            Random rand1 = new Random(47);  
            Random rand2 = new Random(47);  
            int j = rand1.nextInt(20);  
            int k = rand2.nextInt(20);  
            System.out.println(j);  
            System.out.println(k);  
        }  
    }  

(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13.
但每次循环的结果都一样,18,15,13会被顺序循环输出。
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。

public static void main(String[] args) {  
  for(int i=0;i<30;i++){
    Random random = new Random(47); 
    System.out.println(random.nextInt(20));
    System.out.println(random.nextInt(20));
    System.out.println(random.nextInt(20));
    System.out.println("=========================");
  }
 }  
结论

如果以个特定的数作为种子数创建多个random对象的话,调用random.nextInt(a)方法,那么这几个对象每一次调用所生成的数是一样的,也是生成数的顺序是固定的。
而如果是用无参构造函数创建多个对象的话,例如Random r=new Random();它源码就是和当前系统时间对应的相对时间有关的数字作为种子数,所以调用这多个对象的random.nextInt(a)方法所生成的数是不同的。

参考文章:

http://blog.csdn.net/md_shmily92/article/details/44059313

上一篇 下一篇

猜你喜欢

热点阅读