Java中Random类生成[min,max]范围整数需用random.nextInt(max-min+1)+min,如抽奖1–100写为random.nextInt(100)+1;应避免取模、校验边界、多线程用ThreadLocalRandom。

在 Java 中,Random 类可以高效生成指定范围内的整数随机数,适用于抽奖、抽签等场景。关键在于正确计算范围偏移,避免越界或分布不均。
理解 Random.nextInt() 的范围逻辑
nextInt(int bound) 生成的是 [0, bound) 范围内的整数(包含 0,不包含 bound)。要得到 [min, max](含两端)的随机整数,需转换为:random.nextInt(max - min + 1) + min
例如:抽奖号码范围是 1 到 100,则写法为:
random.nextInt(100 - 1 + 1) + 1 → random.nextInt(100) + 1
完整示例代码(含验证)
以下是一个安全、可复用的抽奖方法:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
import java.util.Random;
<p>public class Lottery {
private static final Random random = new Random();</p><pre class="brush:php;toolbar:false;">// 生成 [min, max] 区间内的随机整数(含 min 和 max)
public static int draw(int min, int max) {
if (min > max) throw new IllegalArgumentException("min must be <p>}</p>常见误区与注意事项
- 不要用 nextInt() % n 方式取模:会导致小数值概率略高(尤其当 n 不是 2 的幂时),破坏均匀性
- 边界值必须检查:如 min=10、max=5 会抛异常,生产环境建议提前校验
-
多线程下推荐使用 ThreadLocalRandom:比共享 Random 实例更高效、线程安全
例如:ThreadLocalRandom.current().nextInt(1, 51)(注意:该方法上界是开区间,所以写 51) - 抽奖若需去重:不能只靠随机数,应配合 Set 或 List 随机打乱后取前 N 个
扩展:生成多个不重复的中奖号码
若一次抽 3 个不重复号码(1–20):
List<integer> numbers = new ArrayList(); for (int i = 1; i winners = numbers.subList(0, 3); // 前 3 个即为中奖号</integer>
这种方式保证无重复且完全随机,适合小规模抽奖;大规模可考虑 Fisher-Yates 洗牌或蓄水池采样。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










