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

### Java生成随机数的方法 Java 提供了多种方式来生成随机数,这些方法可以满足不同的需求。以下是几种常见的生成随机数的方法及其特点。 #### 方法一:使用 `Math.random()` `Math.random()` 是一种简单的方式,用于生成一个介于 `[0.0, 1.0)` 范围内的伪随机双精度浮点数。如果需要生成指定范围的整数,可以通过简单的数学运算实现[^5]。 ```java double randomValue = Math.random(); // 生成 [0.0, 1.0) 范围内的随机数 int randomInt = (int)(Math.random() * 100); // 生成 [0, 99] 范围内的随机整数 System.out.println("随机整数: " + randomInt); ``` #### 方法二:使用 `java.util.Random` `java.util.Random` 类提供了更灵活的随机数生成功能。可以通过构造函数指定种子值或使用默认种子值(基于当前时间戳)。需要注意的是,如果使用相同的种子值,每次生成随机数序列将是可预测且一致的[^2]。 ```java Random random = new Random(); int n = random.nextInt(100); // 生成 [0, 99] 范围内的随机整数 System.out.println("随机整数: " + n); ``` 此外,还可以通过指定种子值创建 `Random` 对象,但需注意其可预测性[^2]。 #### 方法三:使用 `SecureRandom` `SecureRandom` 是 `java.security` 包中的一个类,提供更高安全性的随机数生成器。与 `Random` 不同,`SecureRandom` 的随机数生成过程更加复杂且不可预测,适用于密码学场景[^4]。 ```java SecureRandom secureRandom = new SecureRandom(); int secureRandomInt = secureRandom.nextInt(100); // 生成 [0, 99] 范围内的随机整数 System.out.println("安全随机整数: " + secureRandomInt); ``` #### 方法四:使用 `ThreadLocalRandom` 从 Java 7 开始,`ThreadLocalRandom` 被引入以优化多线程环境下的随机数生成性能。相比 `Random`,`ThreadLocalRandom` 在多线程环境中表现更好[^3]。 ```java import java.util.concurrent.ThreadLocalRandom; int threadLocalRandomInt = ThreadLocalRandom.current().nextInt(100); // 生成 [0, 99] 范围内的随机整数 System.out.println("线程本地随机整数: " + threadLocalRandomInt); ``` ### 总结 - 如果需要简单快速地生成随机数,可以选择 `Math.random()` 或 `java.util.Random`。 - 如果需要更高的安全性,推荐使用 `SecureRandom`。 - 在多线程环境下,`ThreadLocalRandom` 是更好的选择,因为它避免了线程间的竞争问题[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值