Java Random伪随机数

什么是伪随机数
  1. 伪随机数是看似随机实质是固定性周期性序列,也就是有规则的随机。
  2. 只要这个随机数是由确定算法生产的,那就是伪随机,只能通过不断算法优化,使你的随机数更加接近随机值。(随机这个属性和算法本身就是矛盾的)
  3. 通过真实随机事件取得的随机数才是真随机数。
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对象的种子相同,而且方法的调用顺序也相同,产生的随机数相同。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容