我们首先来看一下维基百科的定义
伪随机性(Pseudorandomness)是指一个过程似乎是随机的,但实际上并不是。例如伪随机数(或称伪乱数),是使用一个确定性的算法计算出来的似乎是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时假如使用的开始值不变的话,那么伪随机数的数序也不变。伪随机数的随机性可以用它的统计特性来衡量,其主要特征是每个数出现的可能性和它出现时与数序中其它数的关系。伪随机数的优点是它的计算比较简单,而且只使用少数数值很难推算出计算它的算法。一般人们使用一个假的随机数,比如电脑上的时间作为计算伪随机数的开始值。正如我们再api中看到的,我们实行的只是模拟的伪随机数。真正的随机数还得物理设备产生,比如自然的噪声 蜂鸣 。
随机数种子的作用
1.设置了种子,我们每次运行的结果都一样
Random r = new Random(100);
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
1.设置了种子,我们每次运行的结果都一样
Random r = new Random(100);
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
System.out.println(r.nextInt(10));
2.没有设置种子,我们每次运行的结果都不一样
为什么,观察源代码得知,其实构造函数中,默认种子是当前的时间
public Random() { this(++seedUniquifier + System.nanoTime()); }
为什么,观察源代码得知,其实构造函数中,默认种子是当前的时间
public Random() { this(++seedUniquifier + System.nanoTime()); }
你可以认为种子就是一个随机数发生器的初始值。