如何通过 Random 类生成指定范围内的随机整数
如何通过 Random 类生成指定范围内的随机整数

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
Ja va 中 Random.nextInt(int bound) 的正确用法
先说一个最核心的结论:Random.nextInt(n) 这个方法,生成的其实是 [0, n) 这个左闭右开区间内的整数。换句话说,它能取到0,但绝对取不到n。如果你需要的是包含两端点(比如 [min, max])的整数,那就得自己手动做一下偏移和范围调整了。
新手最容易踩的坑,往往是写成 random.nextInt(max - min),结果永远漏掉了最大值 max;或者忘了加上 min 这个偏移量,导致下界完全不对。
- 标准公式:要生成 [min, max](包含两端)的随机整数,正确的写法是:
random.nextInt(max - min + 1) + min。 - 这里的
max - min + 1是关键,它代表了合法的取值总数,必须作为bound参数传进去。 - 如果粗心把
min和max写反了,导致min > max,程序会直接抛出IllegalArgumentException。 - 还有一个隐蔽的陷阱:整数溢出。当
max接近Integer.MAX_VALUE而min又是负数时,max - min + 1这个计算本身就可能溢出。对于这种极端边界情况,更稳妥的做法是直接使用ThreadLocalRandom.current().nextInt(min, max + 1)。
为什么不用 Math.random() 强转?
可能有人会想,Math.random() 返回的是 [0.0, 1.0) 的 double 值,用它乘以范围再强转成 int 不也一样吗?理论上可行,但实践中坑不少。
比如这个写法:(int)(Math.random() * (max - min + 1)) + min。由于 Math.random() 返回值严格小于1.0,乘以N之后最大值也严格小于N,所以强转int后确实能覆盖 [0, N) 的范围。看起来没问题,对吧?但魔鬼藏在细节里:
- 浮点误差:double 类型的乘法存在精度问题,有极小的概率因为舍入导致结果等于
N,强转后就会超出预期范围。 - 一致性风险:不同JVM实现或版本可能在细节处理上有差异,导致行为不一致。
- 性能开销:
Math.random()内部其实也使用了Random类,并且多了一层 synchronized 锁,在高频调用时会有不必要的性能损耗。
所以,除非是维护遗留代码,否则真的没必要绕这个远路。
多线程环境下优先用 ThreadLocalRandom
在高并发场景下,使用同一个 Random 实例会产生激烈的锁竞争,导致性能急剧下降。这时候,ThreadLocalRandom 就是你的最佳选择,它为每个线程维护了独立的随机数生成器,完全无锁。
用它来生成 [min, max] 区间的整数,语法上更加简洁直观:ThreadLocalRandom.current().nextInt(min, max + 1)。这里需要特别注意,它的第二个参数是独占的上界,所以我们必须传入 max + 1。
- 安全性更高:该方法内部已经处理了整数溢出的检查,比自己手动计算
max - min + 1更安全。 - 使用方式固定:不能通过
new来创建,必须通过静态方法current()获取当前线程的实例。 - 一个重要的限制:它不支持设置种子(seed),因此其随机序列是不可重现的。如果你的单元测试需要确定性的随机结果来进行断言,那么还是应该使用可以传入固定种子的
Random。
边界值测试容易忽略的细节
写单元测试时,只测一下 min 和 max 这两个边界值是远远不够的。真正容易出问题的,往往是那些“边界的边界”。
- 当
min == max:此时范围只有一个值,理应稳定返回该值。但如果错误地写成了nextInt(max - min),就会导致除零异常。 - 当范围覆盖整个int区间:比如
min == Integer.MIN_VALUE且max == Integer.MAX_VALUE。这时范围总数超过了 2^31,max - min这个计算本身就会溢出。这种情况下,必须依赖ThreadLocalRandom.nextInt(min, max + 1)这类在内部使用 long 运算的方法来规避。 - 负数区间:例如生成 [-5, -1] 的随机数。很多人会误以为
nextInt(-1 + 5) - 5能行,但实际上它生成的是 [-5, -1) 这个区间,永远漏掉了 -1 这个上界。
总之,在处理随机数范围时,边界情况永远比直觉更脆弱,尤其是在混合了整数溢出和开闭区间语义的时候。多花几分钟考虑这些边缘案例,能省下未来数小时的调试时间。
相关攻略
Notepad++需导入Groovy xml并重启才能实现 groovy文件自动高亮:先通过“语言→定义语言→导入”添加语言定义,再确保name为Groovy、ext含groovy、注释及关键字配置正确,重启后生效。 如果你经常和Groovy脚本打交道,可能会发现Notepad++默认并不认识它。别
道友来挖宝2026礼包码最新合集 直接分享核心福利!本文为各位道友精心整理了《道友来挖宝》当前所有可用的礼包兑换码大全,包含永久有效与限时专属两类,助你开局即领先。永久通用码包括:DYLW888、DYLW666、VIP666、VIP888、DYLW2026、KHLB666、XC888;3月最新限时码
世界森林日的由来 说起“世界森林日”,你可能也听过它的另一个名字——“世界林业节”。它的英文名称是 “World Forest Day”。这个纪念日的诞生,要追溯到1971年。当时,在欧洲农业联盟的特内里弗岛大会上,西班牙率先提出设立森林日的倡议,并获得了与会各方的共识。同年11月,联合国粮农组织(
祭祀高禖 说到上巳节,最核心的仪式莫过于祭祀高禖了。这位神祇掌管着婚姻与生育,古人认为,家族的延续与兴旺都离不开祂的庇佑。“高禖”又称“郊禖”,顾名思义,其神位常设于郊外。从字源上看,“禖”与“媒”相通,又源于“腜”字,本身就蕴含着生育与繁衍的意味。 有趣的是,高禖神的形象并非一成不变。最早的高禖神
当务之急:先抓住最关键的那件事 话说回来,我们每天面对的信息和待办事项多如牛毛,究竟该从哪里下手?这个问题,其实早在两千多年前,就有人提出来了。孟子的弟子也曾为此困惑:要知道和要实践的事情那么多,总得有个先后主次吧? 孟子的回答,堪称时间管理与决策智慧的古典版。他说,有智慧的人并非无所不知,而是懂得
热门专题
热门推荐
市场概览 眼下的霍尔木兹海峡航运市场,似乎已经给“四月底恢复正常”这个选项判了“死刑”——市场定价显示,这种可能性为零。目光放远至2026年4月,WTI原油期货的价格预测持续获得支撑,这无异于在说:油价上涨几乎是板上钉钉。再看向同年6月,油价触及每桶90美元的可能性,市场给出的概率是百分之百。 主要
什么是Vidgo AI? 说简单点,Vidgo AI就是一个能把你的图片和文字“变活”的智能工具。你给它一张图,或者一段描述,它就能利用人工智能技术,为你生成一段视频。这可不是什么简单的小把戏,它背后是一整套相当全面的AI工具集,目的就是帮你把那些天马行空的创意点子,转化成让人眼前一亮的具体作品。
什么是MakeUGC? 简单来说,MakeUGC是一个革命性的内容创作工具。它本质上是一个由人工智能深度驱动的用户生成内容平台,核心目标非常明确:帮助任何人,哪怕毫无视频制作经验,也能在短短几秒钟内,打造出专业且极具吸引力的营销视频。这个平台聪明地整合了多项尖端功能,比如从海量库中智能匹配的“AI创
最新消息!Runway Gen-3 Alpha 文本生成视频模型已开放 来了!备受瞩目的Runway Gen-3 Alpha文本生成视频模型,现在已经正式面向所有付费用户开放使用。这标志着,一个以高保真、快速响应和高度可控为特点的视频生成新阶段,已经触手可及。感兴趣的话,可以直接前往其官网体验这一前
当图片里的文字需要“搬家”:几款靠谱工具怎么选 处理图片时,碰到需要把里面的文字提取出来的情况,是常有的事。这时,一款好用的文字识别(OCR)工具就能帮上大忙。不过,工具那么多,该怎么选呢?其实关键就看你具体的使用场景和需求。下面这几类工具,覆盖了从轻量到专业的不同情况,你可以对号入座。 1 随手





