You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:25:39