zoukankan      html  css  js  c++  java
  • java学习-java.lang.Math随机数生成

    java中的随机数,java.lang.Math.random()和java.util.Random.nextDouble()

    Math.random()方法是生成0.0---1.0区域内的随机数,每次返回的数值都是不一样,应该可以算作随机数,

    而Random类,如果初始化时候new Random(12).nextDouble()是这样设置的int seed  这个值一直是12,那么,不论循环多少次,多长时间间隔,

      生成的第一个随机数即第一次调用nextDouble()方法返回的结果都是一样的。这个是因为,这个生成的随机数是通过    12这个seed为参数,调用特定算法生成了,所以不论怎样,生成的数值都是一样,这个算伪随机数

    Math.random()方法内部其实也是调用的Random类的nextDouble()方法。只不过其调用的是无参的构造方法

        /**
         * Creates a new random number generator. This constructor sets
         * the seed of the random number generator to a value very likely
         * to be distinct from any other invocation of this constructor.
         */
        public Random() {
            this(seedUniquifier() ^ System.nanoTime());
        }

    这个方法会调用时间戳还有原子seeduniquifier()方法进行seed参数的初始化,所以Math.random()方法每次生成的数据都是不一样的

    根据网上说法:发现java中的随机方法是相对意义上的真随机数,也就是伪随机数。

     Random类构造方法带固定参数,

       黑客可以通过生成的随机序列反推出这个随机种子,也就是seed参数的值,从而预测出下一个产生的随机序列数

    如下面,生成1到100的随机数,并统计1到100随机出现的次数。

    public class RandomTest {
        static Random random = new Random(10);
        public static void main(String[] args) {
            int[] count = new int[100];
            for (int i = 0; i < 100000; i++) {
                //System.out.println(Math.random() * 10 + "工具类:" + random.nextInt(5));
                int number = random.nextInt(100) + 1;
                //System.out.println("生成随机数为:"+number);
                count[number - 1]++;
            }
    
            for (int i = 0; i < 100; i++) {
                System.out.println("数字" + i + 1 + ":" + count[i]);
            }
        }
    }

    重复执行多次各个数据出现的次数都是一样了。下面是返回的结果,两次返回的结果是一样的

    数字86:992
    数字87:996
    数字88:998
    数字89:1037
    数字90:899
    数字91:987
    数字92:988
    数字93:978
    数字94:981
    数字95:1001
    数字96:985
    数字97:1019
    数字98:1018
    数字99:930
    数字100:962

    所以使用随机数的时候最好默认使用空的构造方法,就可以防止数据出现次数相同

    new Random();

  • 相关阅读:
    个人浏览器安装的插件
    angularjs 1 Failed to read the 'selectionStart' property from 'HTMLInputElement':
    git 配置用户名和邮箱
    修改Atom 隐藏.gitignore忽略的文件/文件夹的配置
    Ubuntu 安装php_intl 扩展
    yii2 ./yii command : No such file or directory
    vagrant yii2 Exception 'yiidbException' with message 'SQLSTATE[HY000] [2002]
    [转载]Ubuntu 14.04设置固定ip
    [转载]删除所有的.svn文件夹
    Centos7.2正常启动关闭CDH5.16.1
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/9541667.html
Copyright © 2011-2022 走看看