生成随机运算符异常:两次输出同一运算符的问题求助
问题原因
你当前的代码只在程序开头生成了一次随机运算符和对应的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
相关产品推荐
相关产品推荐

