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(); } }
额外修复的问题
- 原代码中
operatorChoice.nextInt(3)只能生成0/1/2,除法分支永远不会触发,改为nextInt(4)才能覆盖加减乘除四种情况。 - 原代码中生成第二个数字时,若第一个数字为1,会导致
nextInt(0)抛出异常,新增循环确保第二个数字不为0。 - 除法场景下新增循环,确保两个数字能整除,避免非整数结果。
内容的提问来源于stack exchange,提问作者Lau
相关产品推荐
相关产品推荐

