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

原文地址:https://www.cnblogs.com/gne-hwz/p/9541667.html