Java中生成指定范围随机数需“缩放+平移”:整数用nextInt(max-min+1)+min得[min,max];浮点数用nextDouble()*(max-min)+min得[min,max);长整型推荐ThreadLocalRandom.longs(min,max+1);须避免nextInt(max)+min等常见错误。

Java 中用 Random 生成指定范围的随机数,核心是“缩放 + 平移”:先生成 [0, 1) 的浮点数或 [0, n) 的整数,再通过数学变换落到目标区间 [min, max](含两端)。
生成指定范围的随机整数(含 min 和 max)
这是最常见需求。例如生成 [10, 20] 之间的随机整数(包含 10 和 20):
- 用
random.nextInt(bound)生成 [0, bound) 的整数,所以要先算出区间长度:max - min + 1 - 再把结果加上
min,完成平移
代码示例:
Random r = new Random(); int min = 10, max = 20; int num = r.nextInt(max - min + 1) + min; // 结果在 [10, 20] 内
⚠️ 注意:nextInt(n) 的参数 n 必须为正整数,否则抛 IllegalArgumentException;确保 max >= min。
立即学习“Java免费学习笔记(深入)”;
生成指定范围的随机浮点数(含 min,不含 max)
使用 nextDouble() 或 nextFloat(),它们返回 [0.0, 1.0) 区间的值:
- 乘上区间长度
(max - min),得到 [0.0, max-min) 的数 - 再加
min,得到 [min, max) 区间
代码示例:
double min = 1.5, max = 3.7; double d = r.nextDouble() * (max - min) + min; // 结果 ∈ [1.5, 3.7)
如果需要闭区间 [min, max](包含 max),可用 nextDouble() * (max - min + Double.MIN_VALUE) + min,但一般场景用 [min, max) 更自然且避免浮点精度陷阱。
生成指定范围的随机长整型(long)
Random 没有直接的 nextLong(long bound),但可借助 nextLong() 的均匀分布特性手动截取:
- 对大范围(如 [0, Long.MAX_VALUE]),可直接用
Math.abs(r.nextLong()) % range + min,但有轻微偏差(因Long.MAX_VALUE+1不整除 range) - 更可靠的方式是循环重试(拒绝采样),适合范围远小于
Long.MAX_VALUE的情况
推荐简洁安全写法(适用于一般业务范围,如 [0, 1000000L]):
long min = 100L, max = 999L; long range = max - min + 1; long num = ThreadLocalRandom.current().longs(min, max + 1).findFirst().orElse(min);
✅ 提示:JDK 7+ 更推荐用 ThreadLocalRandom 替代 Random(尤其多线程环境),它性能更好、线程安全,且自带 ints()/longs()/doubles() 方法直接支持范围。
避免常见错误
这些写法容易出错,需注意:
-
r.nextInt(max) + min→ 实际范围是 [min, min+max),不是 [min, max] -
(int)(Math.random() * (max - min)) + min→ 缺少 +1,导致 max 永远取不到 - 用
new Random(seed)在循环中反复创建 → 种子相同会导致重复序列,应复用同一个实例
不复杂但容易忽略细节,按“长度计算 + 偏移”两步走,基本不会错。


















