Java的Random类
在Java中java.util.Random类是日常开发中最常用的伪随机数生成器。它基于线性同余算法生成随机数只要给定相同的初始值种子 seed就能生成完全相同的随机数序列。 Random 类的基础使用使用 Random 类非常简单通常分为两步创建对象推荐使用无参构造new Random()它会自动以当前系统时间纳秒级作为种子保证每次运行的随机性。调用方法根据需要生成不同类型或范围的随机数。常用方法速查表方法说明返回值范围示例nextInt()生成任意 int 整数-2³¹ 到 2³¹-1nextInt(int bound)生成指定上限的随机整数[0, bound) 左闭右开nextDouble()生成随机双精度浮点数[0.0, 1.0)nextBoolean()生成随机布尔值true 或 false各50%概率nextLong()生成任意 long 整数-2⁶³ 到 2⁶³-1nextGaussian()生成高斯正态分布的数均值为0标准差为1。取值范围是 (-∞, ∞)大概率[-1.0, 1.0]约 99.7% [-3.0, 3.0]基础代码示例importjava.util.Random;publicclassRandomDemo{publicstaticvoidmain(String[]args){// 1. 创建 Random 实例建议复用同一个实例避免在短时间内因种子相同产生重复序列RandomrandomnewRandom();// 2. 生成 [0, 10) 的随机整数即 0 到 9intnum1random.nextInt(10);// 3. 生成 [5, 15) 的随机整数即 5 到 14// 公式random.nextInt(最大值 - 最小值) 最小值intnum2random.nextInt(15-5)5;// 4. 生成 [1, 6) 的随机整数模拟掷骰子闭区间intdicerandom.nextInt(6)1;// 5. 生成 [0.0, 1.0) 的随机小数doubledrandom.nextDouble();}}⚙️ 核心原理种子Seed的作用Random 是“伪随机”的。如果你在创建对象时指定了固定的种子例如new Random(12345L)那么无论你运行多少次程序它生成的随机数序列永远是固定且可预测的。这在单元测试或算法调试中非常有用但在生产环境中应避免硬编码固定种子否则可能导致集群中多个服务生成完全相同的“随机”ID。 进阶多线程与高并发场景ThreadLocalRandomRandom类在多线程环境下是线程安全的但它内部使用 CAS比较并交换机制来保证原子性。在高并发场景下多个线程竞争同一个Random实例会导致严重的性能瓶颈。在并发环境下强烈推荐使用java.util.concurrent.ThreadLocalRandom。它为每个线程维护独立的随机数生成器完全无锁性能极高。ThreadLocalRandom 的用法importjava.util.concurrent.ThreadLocalRandom;// 获取当前线程的 ThreadLocalRandom 实例不能 newThreadLocalRandomrandomThreadLocalRandom.current();// 生成 [10, 100) 的随机整数ThreadLocalRandom 原生支持直接指定上下限intnumrandom.nextInt(10,100); 安全场景密码与密钥生成SecureRandom如果你的随机数用于生成密码、加密密钥、Token、盐值等安全敏感信息Random和ThreadLocalRandom都是不合格的因为它们的算法容易被预测。此时必须使用java.security.SecureRandom。它基于操作系统的熵源如/dev/random生成真正的强随机数虽然初始化稍慢但具备极高的安全性不可被预测。 总结与选型建议普通单线程/低并发业务如抽奖、模拟数据使用Random。高并发/多线程业务如Web服务生成订单号首选ThreadLocalRandom。安全敏感业务如生成Token、密钥必须使用SecureRandom。