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

生成随机运算符异常:两次输出同一运算符的问题求助

问题原因

你当前的代码只在程序开头生成了一次随机运算符和对应的operatorSwitch变量,两道题目直接复用了这个已经确定的值,所以运算符完全相同。另外还有个隐藏问题:operatorChoice.nextInt(3)只会生成0、1、2三个整数,switch里的case3(除法)永远不会被触发,除法运算符根本不会出现。

解决方案

把生成随机运算符、计算结果的逻辑封装成独立方法,每次需要生成新题目时调用这个方法,就能得到全新的随机运算符和对应结果。或者在每道题之前重新执行一次运算符生成的逻辑。

修改后的代码示例(封装方法版)

首先定义生成运算符的方法:

private static char generateRandomOperator(Random rand, int firstNum, int secondNum, int[] calcResult) {
    // 生成0-3的随机数,对应四个运算符
    int operatorType = rand.nextInt(4);
    switch (operatorType) {
        case 0:
            calcResult[0] = firstNum + secondNum;
            return '+';
        case 1:
            calcResult[0] = firstNum - secondNum;
            return '-';
        case 2:
            calcResult[0] = firstNum * secondNum;
            return '*';
        case 3:
            // 注意:确保secondNum不为0,避免除零异常
            calcResult[0] = firstNum / secondNum;
            return '/';
        default:
            calcResult[0] = 0;
            return ' ';
    }
}

然后在主逻辑中调用两次,生成两道独立的题目:

import java.util.Random;
import java.util.Scanner;

public class MathQuiz {
    public static void main(String[] args) {
        Random operatorRand = new Random();
        Random numRand = new Random();
        Scanner scanner = new Scanner(System.in);
        int[] resultHolder = new int[1]; // 用来传递计算结果

        // 第一题
        int firstNum = numRand.nextInt(9) + 2;
        int secondNum = numRand.nextInt(firstNum - 1);
        char operator = generateRandomOperator(operatorRand, firstNum, secondNum, resultHolder);
        int correctAnswer = resultHolder[0];

        System.out.println("Question 1, what is " + firstNum + operator + secondNum);
        int userAnswer = scanner.nextInt();

        // 第二题:重新生成数字和运算符
        firstNum = numRand.nextInt(9) + 2;
        secondNum = numRand.nextInt(firstNum - 1);
        operator = generateRandomOperator(operatorRand, firstNum, secondNum, resultHolder);
        correctAnswer = resultHolder[0];

        System.out.println("Question 2, what is " + firstNum + operator + secondNum);
        userAnswer = scanner.nextInt();

        scanner.close();
    }

    // 上面定义的generateRandomOperator方法放在这里
    private static char generateRandomOperator(Random rand, int firstNum, int secondNum, int[] calcResult) {
        int operatorType = rand.nextInt(4);
        switch (operatorType) {
            case 0:
                calcResult[0] = firstNum + secondNum;
                return '+';
            case 1:
                calcResult[0] = firstNum - secondNum;
                return '-';
            case 2:
                calcResult[0] = firstNum * secondNum;
                return '*';
            case 3:
                calcResult[0] = firstNum / secondNum;
                return '/';
            default:
                calcResult[0] = 0;
                return ' ';
        }
    }
}

简单修改版(不封装方法)

如果不想封装方法,直接在第二题之前重新执行运算符生成的逻辑即可:

Random operatorChoice = new Random();
Random randN = new Random();
Scanner scanner = new Scanner(System.in);

int b = 0;
int c = 0;
String operatorSwitch;

// 第一题
int firstNumbereasy = randN.nextInt(9)+2; 
int secondNumbereasy= randN.nextInt(firstNumbereasy - 1); 

int operator = operatorChoice.nextInt(4); // 修改为nextInt(4)
switch (operator){
    case 0: operatorSwitch= "+";
        c = firstNumbereasy+secondNumbereasy;
        break;
    case 1: operatorSwitch= "-";
        c = firstNumbereasy-secondNumbereasy;
        break;
    case 2: operatorSwitch= "*";
        c = firstNumbereasy*secondNumbereasy;
        break;
    case 3: operatorSwitch= "/";
        c = firstNumbereasy/secondNumbereasy;
        break;
    default: operatorSwitch = "";
        c = 0;
}

System.out.println("Question 1, what is " + firstNumbereasy +operatorSwitch+ secondNumbereasy );
b= scanner.nextInt();

// 第二题:重新生成数字和运算符
firstNumbereasy = randN.nextInt(9)+2; 
secondNumbereasy= randN.nextInt(firstNumbereasy - 1); 

// 重新生成运算符
operator = operatorChoice.nextInt(4);
switch (operator){
    case 0: operatorSwitch= "+";
        c = firstNumbereasy+secondNumbereasy;
        break;
    case 1: operatorSwitch= "-";
        c = firstNumbereasy-secondNumbereasy;
        break;
    case 2: operatorSwitch= "*";
        c = firstNumbereasy*secondNumbereasy;
        break;
    case 3: operatorSwitch= "/";
        c = firstNumbereasy/secondNumbereasy;
        break;
    default: operatorSwitch = "";
        c = 0;
}

System.out.println("Question 2, what is " + firstNumbereasy + operatorSwitch + secondNumbereasy); 
b = scanner.nextInt();

内容的提问来源于stack exchange,提问作者Lau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:25:21