https://blog.csdn.net/hustspy1990/article/details/93364805
https://blog.csdn.net/qq_33101675/article/details/81028210?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
1.Random (Instances of java.util.Random are threadsafe)
Random 生成随机数,有一个构造函数,传递的 long 类型的值,当使用空构造的时候,实际上传递的是 System.nanoTime() ,即当前时间的毫秒数的值。参数也叫种子。一般情况下使用空参构造即可,如果指定
种子的数值,则生成的随机数都是一样的。所以种子不能写死
Java.util.Random 类中实现的随机算法是伪随机,也就是有规则的随机,就是在给定 seed 的区间内随机生成的数字
相同种子数的Random 对象,产生的随机数是完全一样的
Random 是线程安全的,内部的Seed 是全局变量,多线程生成随机数时,使用了 cas
2.ThreadLocalRandom
ThreadLocalRandom 是 Java7 新增的,给多线程并发使用的 , 速度比Random 要快。 ThreadLocalRandom 是通过 ThreadLocal 改进的用于随机生成的工具类,每个线程单独持有一个,不存在竞争问题
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
for(int i=0;i<10;i++){
System.out.println(threadLocalRandom.nextInt(10));
}
构造方法是 private ,只能是单例模式,不能够设置 seed
3.SecurityRandom
SeurityRandom 内置两种随机数算法,NativePrRNG 和 SHA1PRNG 。通过 new 来创建,默认使用 NavivePRNG 算法生成随机数,也可以通过参数修改
也可以通过 getInstance 来初始化对象,有一个参数传递算法名就可以,第二个参数指定算法程序包 。SHA1PRNG 的性能比 NATIVEPRNG 性能好一倍
可以使用 new创建 ,也可以是静态方法getInstance() 获取,可以设置 seed ,如果seed 固定,那么随机的结果也将不变
4. Math.random()
比较常用的生成随机数的方法,默认 0.0-1.0 之间的小数【左闭右开】
总结:使用随机数,对安全要求不高的情况,Rando, 要求较高使用 SecurityRandom
Random 是线程安全的,用CAS 保持,性能不高,多线程尽量使用 ThreadLocalRandom
5.JvmRandom Jvm 对Random 的一种实现
在 commons-lang 包下
JVMRandom jvmRandom = new JVMRandom();