Java猜数字程序出现java.lang.AssertionError问题求助
猜数字程序AssertionError问题排查与解决
我正在开发一个猜数字程序,该程序从指定范围内随机猜测数字并验证是否与给定数字匹配。程序最多运行10次,猜中则终止,未猜中则触发失败终止。运行时出现如下错误:
at GuessingTest.main(GuessingTest.java:33) **current directly** ; /usr/bin/env /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/bin/java @/var/folders/zl/r96mn6p116125gw39hst2gp40000gn/T/cp_2tq0yp3psptn6qjx3o6suw328.argfile GuessingTest Exception in thread "main" java.lang.AssertionError at org.junit.Assert.fail(Assert.java:87) at org.junit.Assert.assertTrue(Assert.java:42) at org.junit.Assert.assertTrue(Assert.java:53) at GuessingTest.guess(GuessingTest.java:30) at GuessingTest.main(GuessingTest.java:35)
代码文件
Guessing.java
public class Guessing { // Your local variables here private int low = 0; private int high = 1000; int randomNum; /** * Implement how your algorithm should make a guess here */ public int guess() { randomNum = (int) ((Math.random() * (low - high)) + low); return randomNum; } /** * Implement how your algorithm should update its guess here */ public void update(int answer) { if (answer == 1) { low = randomNum; } else if (answer == -1) { high = randomNum; } } }
GuessingTest.java
import org.junit.Test; import java.util.Random; import static org.junit.Assert.*; public class GuessingTest { @Test public void guess() { Random r = new Random(); int hiddenNumber = r.nextInt(1001); Guessing g = new Guessing(); int remainingGuesses = 10; while (remainingGuesses >= 0) { int guess = g.guess(); if (guess == hiddenNumber) { break; } else if(guess > hiddenNumber) { g.update(1); remainingGuesses--; } else { g.update(-1); remainingGuesses--; } } assertTrue(remainingGuesses >= 0); } public static void main(String[] args) { GuessingTest test = new GuessingTest(); test.guess(); } }
问题排查与修复
1. 随机数生成逻辑错误
Guessing.java的guess()方法中,随机数计算式错误:
randomNum = (int) ((Math.random() * (low - high)) + low);
low - high是负数,Math.random()返回0到1之间的正数,相乘结果为负数,加上low会得到负数,而隐藏数字范围是0-1000,这导致永远猜不对,耗尽10次机会后触发断言失败。
正确的随机数生成应该覆盖[low, high]的所有整数:
randomNum = low + (int) (Math.random() * (high - low + 1));
加1是为了确保能取到high本身,完整覆盖0-1000的范围。
2. 测试循环边界错误
GuessingTest.java的循环条件remainingGuesses >= 0会导致最多执行11次猜测(从10减到0,共11次),不符合“最多10次”的需求。应将循环条件改为remainingGuesses > 0,初始值保持10,刚好执行10次后终止。
3. 更新逻辑参数传递错误
测试中,参数传递逻辑完全颠倒:
- 当
guess > hiddenNumber时,说明猜大了,需要调小上限,应传递-1给update() - 当
guess < hiddenNumber时,说明猜小了,需要调低下限,应传递1给update()
原代码的参数传递与逻辑相反,导致范围更新错误,进一步降低猜中概率。
最终修正后的代码
Guessing.java
public class Guessing { private int low = 0; private int high = 1000; int randomNum; public int guess() { // 生成[low, high]范围内的随机整数 randomNum = low + (int) (Math.random() * (high - low + 1)); return randomNum; } public void update(int answer) { if (answer == 1) { // 猜小了,下限提升到当前猜测值 low = randomNum; } else if (answer == -1) { // 猜大了,上限降低到当前猜测值 high = randomNum; } } }
GuessingTest.java
import org.junit.Test; import java.util.Random; import static org.junit.Assert.*; public class GuessingTest { @Test public void guess() { Random r = new Random(); int hiddenNumber = r.nextInt(1001); Guessing g = new Guessing(); int remainingGuesses = 10; while (remainingGuesses > 0) { int guess = g.guess(); if (guess == hiddenNumber) { break; } else if(guess > hiddenNumber) { g.update(-1); remainingGuesses--; } else { g.update(1); remainingGuesses--; } } assertTrue(remainingGuesses >= 0); } public static void main(String[] args) { GuessingTest test = new GuessingTest(); test.guess(); } }
内容的提问来源于stack exchange,提问作者Suryansh Kushwaha
相关产品推荐
相关产品推荐

