Java随机数
1、Math.random() 静态方法
0 ~ 1的double
第一次调用时,自动创建伪随机数生成器,即new java.util.Random()
,之后都使用该生成器
-
initRNG()方法是synchronized的,多线程时一个线程创建伪随机数生成器(使用当前时间作为种子),其他线程利用该生成器
-
若各线程各自创建生成器,碰巧种子相同,则会结果相同,导致生成线程不安全
2、java.util.Random 工具类
基本算法
- Linear congruential pseudorandom number generate (LGC 线性同余法)
- 缺点:可预测 (默认以系统当前时钟作为种子)
- 种子一样时,产生的随机数也一样
3、java.util.concurrent.ThreadLocalRandom 工具类
每个线程有一个独立的随机数生成器
- ThreadLocalRandom不通过new实例化
- 是第一次使用其静态方法
current()
,得到ThreadLocal< ThreadLocalRandom >
实例化 - 然后调用Random类的各个方法
4、java.Security.SecureRandom
提供了加密的强随机数生成器(RNG)
种子必须不可预知,产生非确定输出,也提供了实现算法无关的算法
- 仅指定算法名称:
SecureRandom.getInstance("SHA1PRNG");
- 算法+包:
SecureRandom.getInstance("SHA1PRNG", "SUN");
5、随机字符串
RandomStringUtil类