java中生成随机数应按场景选型:random适用于游戏、测试等一般场景,securerandom专用于密码、令牌等安全敏感场景;前者伪随机可预测,后者基于熵源不可预测。

Java 中生成随机数主要用 Random 和 SecureRandom,前者适合一般场景(如游戏、测试),后者用于安全敏感场景(如密码、令牌、密钥)。关键区别在于:Random 是伪随机、可预测;SecureRandom 是真随机或熵源更强的随机,不可预测。
用 Random 生成常见类型随机数
Random 简单易用,线程不安全,多线程下建议每个线程单独实例,或用 ThreadLocalRandom(推荐)。
- 生成 int 范围 [0, n):
random.nextInt(n)(比如nextInt(10)得 0~9) - 生成 [min, max] 区间整数:
random.nextInt(max - min + 1) + min - 生成 double [0.0, 1.0):
random.nextDouble();扩展为 [a, b):乘以 (b-a) 再加 a - 随机布尔值:
random.nextBoolean() - 随机从数组选元素:
arr[random.nextInt(arr.length)]
SecureRandom 的正确初始化和使用
SecureRandom 是 Random 的子类,但构造更重,不应频繁新建。默认使用系统熵源(如 /dev/urandom),安全性高,但可能阻塞(尤其在熵不足时)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 推荐方式:直接无参构造(JDK 8+ 默认选用最优算法)
new SecureRandom() - 指定算法(如 SHA1PRNG):
SecureRandom.getInstance("SHA1PRNG"),但注意某些算法在不同 JDK 版本行为不一致 - 生成随机字节数组(常用于密钥):
secureRandom.nextBytes(byteArray) - 生成 int/long:支持
nextInt()、nextLong(),但不推荐用于范围裁剪(因可能引入偏差),应配合BigInteger或掩码处理
避免常见错误
很多问题不是 API 不会用,而是逻辑或安全意识不到位。
- 别用
System.currentTimeMillis()或new Random(seed)做种子来“增强” Random——这反而降低随机性,且可预测 - 不要在循环里反复 new SecureRandom——它初始化开销大,且重复创建可能耗尽熵池
- 不用 Random 生成密码、token、session ID——即使加长位数也无法弥补可预测缺陷
- Web 应用中生成验证码若非安全关键,Random 足够;但 JWT 签名密钥、AES 密钥必须用 SecureRandom
简单对比与选择建议
看需求定,不追求“更高级”,只求“刚好合适”。
- 模拟掷骰子、洗牌、单元测试数据 →
Random或ThreadLocalRandom.current()(性能更好) - 生成 API key、重置令牌、加密盐值、RSA 密钥对 → 必须用
SecureRandom - 不确定要不要安全?先默认用 SecureRandom;确认性能瓶颈后再评估能否降级
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










