目录
- 1. 日常开发(非安全场景):
ThreadLocalRandom(推荐) - 2. 单线程/简单场景:
Random - 3. 安全场景(如密码、Token生成):
SecureRandom - 4. Java 8+ 流式处理:
Random结合流 - 关键总结
在 Java 中生成随机数的“靠谱”实现,需要根据具体场景(如安全性、性能、随机性要求)选择合适的工具类。以下是几种常用方案及适用场景,按推荐优先级排序:
1. 日常开发(非安全场景):ThreadLocalRandom(推荐)
- 优势:线程安全、高性能(避免线程竞争)、随机性良好,专为多线程环境设计。
- 适用场景:普通业务逻辑(如随机数生成、抽奖、随机排序等非加密场景)。
- 使用示例:
import java.util.concurrent.ThreadLocalRandom;public class RandomExample {public static void main(String[] args) {// 获取当前线程的随机数实例ThreadLocalRandom random = ThreadLocalRandom.current();// 生成 [0, 100) 之间的整数int intVal = random.nextInt(100);// 生成 [5, 10] 之间的整数int rangeVal = random.nextInt(5, 11);// 生成随机布尔值boolean boolVal = random.nextBoolean();// 生成 [0.0, 1.0) 之间的doubledouble doubleVal = random.nextDouble();} }
2. 单线程/简单场景:Random
- 优势:API 简单,适合单线程或低并发场景。
- 注意:多线程环境下使用同一个
Random实例会导致竞争,性能下降,且可能降低随机性。 - 使用示例:
import java.util.Random;public class RandomExample {public static void main(String[] args) {Random random = new Random();int intVal = random.nextInt(100); // [0, 100)long longVal = random.nextLong();float floatVal = random.nextFloat(); // [0.0f, 1.0f)} }
3. 安全场景(如密码、Token生成):SecureRandom
- 优势:加密级随机性,通过系统熵源(如
/dev/random)生成,适合需要高安全性的场景(如生成密钥、验证码、令牌等)。 - 注意:性能较低(熵源获取可能阻塞),非安全场景不建议使用。
- 使用示例:
import java.security.SecureRandom;public class SecureRandomExample {public static void main(String[] args) {SecureRandom secureRandom = new SecureRandom();// 生成随机字节数组(常用于加密密钥)byte[] key = new byte[16];secureRandom.nextBytes(key);// 生成 [0, 100) 之间的安全整数int secureInt = secureRandom.nextInt(100);} }
4. Java 8+ 流式处理:Random 结合流
- 适合批量生成随机数(如生成随机列表):
import java.util.Random; import java.util.stream.IntStream;public class RandomStreamExample {public static void main(String[] args) {// 生成10个 [0, 100) 的随机整数并打印new Random().ints(10, 0, 100).forEach(System.out::println);} }
关键总结
- 普通业务(多线程):优先用
ThreadLocalRandom(性能+线程安全最佳)。 - 单线程简单场景:
Random足够用。 - 安全相关场景:必须用
SecureRandom(牺牲性能换安全性)。 - 避免使用
Math.random()(本质是Random的静态实例,多线程下性能差,已被ThreadLocalRandom替代)。
根据场景选择即可,无需过度设计,但安全场景必须使用 SecureRandom 避免风险。