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
完整示例代码(含验证)
以下是一个安全、可复用的抽奖方法:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
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 <= max");
return random.nextInt(max - min + 1) + min;
}
public static void main(String[] args) {
// 抽奖:从 1 到 50 中选一个幸运号码
for (int i = 0; i < 5; i++) {
System.out.println("幸运号码:" + draw(1, 50));
}
}
}
常见误区与注意事项
- 不要用 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 <= 20; i++) numbers.add(i); Collections.shuffle(numbers); List<Integer> winners = numbers.subList(0, 3); // 前 3 个即为中奖号
这种方式保证无重复且完全随机,适合小规模抽奖;大规模可考虑 Fisher-Yates 洗牌或蓄水池采样。

















