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();

  • 相关阅读:
    [LintCode] Valid Palindrome 验证回文字符串
    [LeetCode] 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
    [LintCode] Integer to Roman 整数转化成罗马数字
    [LintCode] Roman to Integer 罗马数字转化成整数
    [LintCode] Scramble String 爬行字符串
    [LintCode] Count and Say 计数和读法
    [LintCode] Simplify Path 简化路径
    [LintCode] Length of Last Word 求末尾单词的长度
    [LintCode] Valid Parentheses 验证括号
    [LeetCode] 377. Combination Sum IV 组合之和之四
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/9541667.html
Copyright © 2011-2022 走看看