② 扩展
当然如果你想用它来生成一个一定范围的 int 值也是可以的,你可以这样写:
for (int i = 0; i < 10; i++) { // 生成一个从 0-99 的整数 int number = (int) (Math.random() * 100); System.out.println("生成随机数:" + number); }
以上程序的执行结果为:
③ 实现原理
通过分析 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