random.nextint(int bound) 返回[0, bound)区间整数,不包含bound;猜1–100应写nextint(100)+1,而非nextint(101);用户输入的lower/upper需先校验。

为什么 Random.nextInt() 生成的数总不包含上限?
因为 Random.nextInt(int bound) 的设计就是「左闭右开」:返回 [0, bound) 区间内的整数,不包含 bound。想猜 1–100 之间的数,直接写 random.nextInt(100) 得到的是 0–99,不是你要的范围。
- 正确做法是
random.nextInt(upper - lower + 1) + lower,比如猜 1 到 100:用random.nextInt(100) + 1 - 别手抖写成
nextInt(101)—— 虽然结果看起来对(0–100),但 0 是非法猜测值,逻辑上就漏了校验入口 - 如果
lower和upper来自用户输入,务必先校验lower ,否则 <code>nextInt()会抛IllegalArgumentException
while 循环卡死?检查退出条件是否真能被满足
常见写法是 while (guess != secretNumber),但若用户输错格式(比如输字母)、或输入为空,guess 可能根本没更新,循环就永远不退出。
- 用
Scanner.hasNextInt()预判输入合法性,再调nextInt();否则跳过非法输入并提示,避免阻塞 - 别在循环体开头就读一次输入、结尾再读一次——容易漏掉首次输入或重复读取,推荐统一放在循环末尾(或开头但确保每次必执行)
- 加个计数器或最大尝试次数(如
attempts ),防止无限循环拖垮体验,也方便后续扩展「游戏难度」
Java 中 nextLine() 和 nextInt() 混用导致输入跳过?
这是 Scanner 最经典的坑:nextInt() 不消费换行符,紧接着调 nextLine() 会立刻读到空字符串。
- 在
nextInt()后加一句scanner.nextLine()「吃掉」残留换行符 - 更稳妥的做法是统一用
nextLine()读所有输入,再用Integer.parseInt()转换,异常时捕获NumberFormatException并提示重输 - 如果游戏要支持「输入 quit 退出」,用
nextLine()就天然兼容;用nextInt()则必须额外处理非数字输入流
Random 实例该复用还是每次都 new?
应该复用单个 Random 实例,而不是在循环里反复 new Random()。
- 高频创建会消耗对象和种子初始化开销,虽小但没必要;更重要的是,如果两秒内多次 new,
System.currentTimeMillis()作种子可能重复,导致生成相同随机序列 - 把
Random random = new Random();放在 main 方法外或作为类字段,保证整个游戏生命周期只初始化一次 - 如果需要可重现的测试场景(比如调试固定谜题),可用带 seed 的构造函数:
new Random(42L),但上线版本别硬编码 seed
真正难的不是生成随机数,而是让每次输入都落到可控路径里——尤其当用户乱按、关终端、切窗口时,Scanner 的状态很容易失焦。多加一行 hasNextInt() 或一个 try-catch,比事后查为什么“程序突然没了反应”省半小时。











