什么是伪随机数
- 伪随机数是看似随机实质是固定性周期性序列,也就是有规则的随机。
- 只要这个随机数是由确定算法生产的,那就是伪随机,只能通过不断算法优化,使你的随机数更加接近随机值。(随机这个属性和算法本身就是矛盾的)
- 通过真实随机事件取得的随机数才是真随机数。
Java随机数产生原理:
Java的随机数产生是通过线性同余公式产生的,也就是说通过一个复杂的算法生成的。
在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次。
伪随机数的不安全性:
Java自带的随机数函数是很容易被黑客破解的,因为黑客可以通过获取一定长度的随机数序列来推出你的seed,然后就可以预测下一个随机数。
所以为了安全,不要使用有种子的随机数,更不要暴露你的种子。
种子的作用是什么?
种子就是产生随机数的第一次使用值,机制是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关。种子就是该随机算法的起源数字。
同一个种子,生成N个随机数,当你设定种子的时候,这N个随机数是什么已经确定。
而无参构造函数 new Random(); 其实也有一个随机种子,一个跟时间有关的数字作为种子。
Java random随机数/ seed 种子 / System.nanoTime() 的理解 与 使用_JobShow裁员加班实况-微信小程序-CSDN博客
public static void main(String[] args) {
Random r1 = new Random(1);// 种子为1
Random r2 = new Random(1);// 种子为1
Random r3 = new Random();// 随机种子
for (int i = 0; i < 100; i++) {
System.out.println(r1.nextInt(10));// 取值范围[0,10)即0-9
System.out.println(r2.nextInt(10));// 取值范围[0,10)即0-9
}
}
上面两组结果完全相同。不论执行多少遍执行结果都是固定值5,8,7,3,4,4,4,6,8....
只要两个Random对象的种子相同,而且方法的调用顺序也相同,产生的随机数相同。