以上程序的执行结果为:
SecureRandom 默认支持两种加密算法:
SHA1PRNG 算法,提供者 sun.security.provider.SecureRandom; NativePRNG 算法,提供者 sun.security.provider.NativePRNG。
当然除了上述的操作方式之外,你还可以选择使用 new SecureRandom() 来创建 SecureRandom 对象,实现代码如下:
SecureRandom secureRandom = new SecureRandom();
通过 new 初始化 SecureRandom,默认会使用 NativePRNG 算法来生成随机数,但是也可以配置 JVM 启动参数“-Djava.security”参数来修改生成随机数的算法,或选择使用 getInstance("算法名称") 的方式来指定生成随机数的算法。
Math
Math 类诞生于 JDK 1.0,它里面包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数,当然它里面也包含了生成随机数的静态方法 Math.random() ,此方法会产生一个 0 到 1 的 double 值,如下代码所示。
① 基础使用
for (int i = 0; i < 10; i++) { // 产生随机数 double number = Math.random(); System.out.println("生成随机数:" + number);}
以上程序的执行结果为:
② 扩展
当然如果你想用它来生成一个一定范围的 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 可以看作是生成真正随机数的一个工具类。
本文地址:百科问答频道 https://www.neebe.cn/wenda/903352_3.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!