Java 随机数生成

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;
}

 

转载于:https://my.oschina.net/clyy/blog/1574879

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值