Java生成随机数的4种方式,以后就用它了!(8)

② 扩展


当然如果你想用它来生成一个一定范围的 int 值也是可以的,你可以这样写:


for (int i = 0; i < 10; i++) {
    // 生成一个从 0-99 的整数
    int number = (int) (Math.random() * 100);
    System.out.println("生成随机数:" + number);
}


以上程序的执行结果为:


Java生成随机数的4种方式,以后就用它了!(8)


③ 实现原理


通过分析 Math 的源码我们可以得知:当第一次调用 Math.random() 方法时,自动创建了一个伪随机数生成器,实际上用的是 new java.util.Random(),当下一次继续调用 Math.random() 方法时,就会使用这个新的伪随机数生成器。


源码如下:


public static double random() {
    return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}

privatestaticfinalclass RandomNumberGeneratorHolder {
    staticfinal Random randomNumberGenerator = new Random();
}


总结


本文我们介绍了 4 种生成随机数的方法,其中 Math 是对 Random 的封装,所以二者比较类似。Random 生成的是伪随机数,是以当前纳秒时间作为种子数的,并且在多线程竞争比较激烈的情况下因为要进行 CAS 操作,所以存在一定的性能问题,但对于绝大数应用场景来说,使用 Random 已经足够了。当在竞争比较激烈的场景下可以使用 ThreadLocalRandom 来替代 Random,但如果对安全性要求比较高的情况下,可以使用 SecureRandom 来生成随机数,因为 SecureRandom 会收集一些随机事件来作为随机种子,所以 SecureRandom 可以看作是生成真正随机数的一个工具类。


参考 & 鸣谢


www.cnblogs.com/weink1215/p/4433790.html


blog.csdn.net/lycyingO/article/details/95276195



上一篇:PHP Notice: Undefined index错误提示的解决办法


下一篇:Linux基础命令---nslookup查询域名工具