math.random()生成[0.0,1.0)双精度浮点数,需缩放、平移、截断小数才能得指定整数区间;[min,max]用(int)(math.random()(max-min+1))+min,[min,max)用(int)(math.random()(max-min))+min;禁用math.round(),推荐threadlocalrandom.current().nextint(min,max)。

Math.random() 返回的是 [0.0, 1.0) 区间的 double 值,不能直接生成整数,更不能直接指定区间。要得到指定范围的随机整数(比如 [a, b],含 a 和 b),需要做两步:缩放 + 平移 + 向下取整。
生成 [min, max] 区间内的随机整数(包含两端)
这是最常见需求。公式是:
int randomNum = (int)(Math.random() * (max - min + 1)) + min;
- max - min + 1 是区间内整数总个数(例如 [3,7] 共 5 个数)
- Math.random() * (max - min + 1) 得到 [0.0, max-min+1),即 [0, 5) 这样的范围
- (int)... 截断小数部分,得到 0~4 的 int(注意不是四舍五入)
- + min 把结果平移到目标区间,如 +3 后变成 3~7
生成 [min, max) 区间内的随机整数(含 min,不含 max)
适用于类似数组索引、List.get() 场景(索引范围是 [0, size))。公式更简洁:
int randomIndex = (int)(Math.random() * (max - min)) + min;
- 例如生成 0~9 的随机索引(长度为 10 的数组):
(int)(Math.random() * 10) - 生成 [5, 15) 的整数(即 5~14):
(int)(Math.random() * 10) + 5
注意事项和替代建议
- 不要用 Math.round():它会四舍五入,导致边界概率不均等(如 [0,2] 中 1 出现概率是 0 和 2 的两倍)
-
避免重复创建 Random 实例:如果频繁调用,建议用
ThreadLocalRandom.current().nextInt(min, max)(Java 7+),它线程安全且性能更好 -
Math.random() 是全局共享的,高并发下可能成为瓶颈;长期项目推荐使用
new Random()或ThreadLocalRandom
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











