1、new Random() 和 Math.random() 的区别
简单粗暴的理解,可以将Math.random()归为new Random()中的一部分,因为Math.random()的Random.nextDouble()中的内部方法
Math.random() 使用相对于 new Random() 功能更加单一,仅支持无参方式获取伪随机数,生成范围为 0 到 1 - (2 ^ -53)
new Random() 提供多种类型随机数获取的,除去生成结果类型多样化这一特点外,它还支持生成指定范围内的随机数,同时也可以指定构建时的种子数(不建议使用相同的种子数,相同的种子数下生成的随机数相同)
Math.random() 生成随机数的效率要低于 new Random(),在无并发的情况下使用Math.random()相当简单快捷,若存在并发的情况下,使用 new Random()则会更加安全,因为 new Random() 内部使用 synchronized 进行了安全控制
注:Math.random()效率低于 new Random() 的原因是Math.random()会调用Random.next()两次,而Random.nextXXX()使用Random.next()不多于两次
2、new Random() 和 ThreadLocalRandom 的区别
new Random() 和 ThreadLocalRandom 都是数据安全的,但在多线程并发的情况下new Random()效率低于ThreadLocalRandom,因为new Random()使用 synchronized ,而 ThreadLocalRandom 是直接使用绑定到线程上的
注:ThreadLocalRandom实例化操作 -> ThreadLocalRandom random = ThreadLocalRandom.current();
3、SecureRandom 产生随机码
未仔细了解
SecureRandom 生成随机码安全基本是最高的,但使用率很低,暂未了解在何种场景下需要使用此方式来生成随机码。
SecureRandom 它默认有两种生成算法:NativePRNG、SHA1PRNG,默认情况下使用NativePRNG算法生成。
使用方式:
SecureRandom secureRandom = new SecureRandom();
SecureRandom secureRandom3 = SecureRandom.getInstance("SHA1PRNG");
SecureRandom secureRandom2 = SecureRandom.getInstance("SHA1PRNG", "SUN");
例子:
public String getRandomCode(int digits) throws Exception {
String code = String.valueOf((int)(Math.random() * Math.pow(10, digits)));
if (code.length() < digits) {
// 根据位数后置补零
code = "" + (int)(Integer.parseInt(code) * Math.pow(10, digits - code.length()));
}
return code;
}