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

Java程序生成随机数字与运算符重复问题咨询

问题解决:每次打印的随机数和运算符重复的原因及修复方案

问题原因

你当前的代码中,随机数字、运算符仅在程序初始化时生成一次,之后两次打印题目都是直接复用这组已经固定的值,所以输出的内容完全相同。

修复方案

把生成随机题目(数字、运算符、正确答案)的逻辑封装成一个独立方法,每次需要新题目时调用这个方法,就能获取到全新的随机组合。

步骤1:封装题目生成逻辑

创建一个自定义类存储题目信息,再写一个方法生成题目:

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

public class MathQuiz {
    // 存储简单模式题目信息的内部类
    static class EasyQuestion {
        int firstNum;
        int secondNum;
        String operator;
        int answer;
    }

    // 生成简单模式的随机题目
    private static EasyQuestion generateEasyQuestion() {
        EasyQuestion question = new EasyQuestion();
        Random rand = new Random();

        // 生成1-11之间的第一个数字
        question.firstNum = rand.nextInt(11) + 1;

        // 生成第二个数字(确保不为0,避免除法/减法异常)
        do {
            question.secondNum = rand.nextInt(question.firstNum);
        } while (question.secondNum == 0);

        // 随机选择运算符(0=加,1=减,2=乘,3=除)
        int operatorType = rand.nextInt(4);
        switch (operatorType) {
            case 0:
                question.operator = "+";
                question.answer = question.firstNum + question.secondNum;
                break;
            case 1:
                question.operator = "-";
                question.answer = question.firstNum - question.secondNum;
                break;
            case 2:
                question.operator = "*";
                question.answer = question.firstNum * question.secondNum;
                break;
            case 3:
                // 确保除法能整除,避免小数结果
                while (question.firstNum % question.secondNum != 0) {
                    question.secondNum = rand.nextInt(question.firstNum) + 1;
                }
                question.operator = "/";
                question.answer = question.firstNum / question.secondNum;
                break;
            default:
                question.operator = "+";
                question.answer = question.firstNum + question.secondNum;
        }
        return question;
    }

步骤2:在main方法中调用生成方法

每次需要新题目时,调用generateEasyQuestion()获取新的题目数据:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("-----------------------");
        System.out.println("Choose a mode");
        System.out.println("1.     Easy");
        System.out.println("2.     Hard");
        System.out.println("3.     Easy Elimination");
        System.out.println("4.     Hard Elimination");

        int selection = scanner.nextInt();

        switch(selection) {
            case 1:
                // 生成并打印第一题
                EasyQuestion q1 = generateEasyQuestion();
                System.out.println("Question 1, what is " + q1.firstNum + q1.operator + q1.secondNum);
                int userAnswer1 = scanner.nextInt();
                // 可选:判断答案是否正确
                System.out.println(userAnswer1 == q1.answer ? "Correct!" : "Wrong, the answer is " + q1.answer);

                // 生成并打印第二题
                EasyQuestion q2 = generateEasyQuestion();
                System.out.println("Question 2, what is " + q2.firstNum + q2.operator + q2.secondNum);
                int userAnswer2 = scanner.nextInt();
                System.out.println(userAnswer2 == q2.answer ? "Correct!" : "Wrong, the answer is " + q2.answer);
                break;
            case 2:
                // 这里补充Hard模式逻辑
                break;
            case 3:
                // 这里补充Easy Elimination模式逻辑
                break;
            case 4:
                // 这里补充Hard Elimination模式逻辑
                break;
            default:
                System.out.println("Invalid selection");
        }
        scanner.close();
    }
}

额外修复的问题

  1. 原代码中operatorChoice.nextInt(3)只能生成0/1/2,除法分支永远不会触发,改为nextInt(4)才能覆盖加减乘除四种情况。
  2. 原代码中生成第二个数字时,若第一个数字为1,会导致nextInt(0)抛出异常,新增循环确保第二个数字不为0。
  3. 除法场景下新增循环,确保两个数字能整除,避免非整数结果。

内容的提问来源于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:05:21