我制作的游戏中用户必须解决一个简单的减法,但结果必须是正整数。我设法做了一切,但由于某种原因,答案有时是消极的,我不知道如何解决它
import java.util.Random;
import java.util.Scanner;
public class Subtraction {
public static void main(String[] args) {
Random r = new Random();
final int MAX = 10;
// get two random numbers between 1 and MAX
int num1 = r.nextInt(MAX) - 1;
int num2 = r.nextInt(MAX) - 1;
int total = (num1 - num2);
// display a question
System.out.printf("What is your answer to %d - %d = ?%n", num1, num2);
// read in the result
Scanner stdin = new Scanner(System.in);
int ans = stdin.nextInt();
stdin.nextLine();
// give an reply
if (ans == total) {
System.out.println("You are correct!");
} else {
System.out.println("Sorry, wrong answer!");
System.out.printf("The answer is %d + %d = %d%n", num1, num2, (num1 - num2));
}
}
}
答案 0 :(得分:1)
两种可能的解决方案:只需用一个条件更改总行数,然后从较小的一行中减去较大的一行(除非它们相同,在这种情况下你会得到0)
int total = (num1 > num2) ? (num1 - num2) : (num2 - num1);
或者只使用绝对值:
int total = java.lang.Math.abs(num1 - num2);
也改变printf:
System.out.printf("What is your answer to %d - %d = ?%n", (num1 > num2) ? num1 : num2, (num1 > num2) ? num2 : num1);
条件只是确保较大的数字出现在较小的数字之前,或者如果它们恰好相同,则它们都被列出。
查看http://www.cafeaulait.org/course/week2/43.html以获得更全面的解释?操作
答案 1 :(得分:1)
使用底部的空间生成第一个值,以减去第二个值,第二个值从第一个值开始的范围内生成:
int num1 = r.nextInt(MAX - 1) + 2; // produces values from 2 to MAX, inclusive
int num2 = r.nextInt(num1 - 1) + 1; // produces values from 1 to (num1 - 1), inclusive
第一个数字总是严格地大于第二个数字,通过构造,因此差异将始终是一个正整数。
答案 2 :(得分:0)
嗯,在同一范围内有两个随机数,按随机顺序,冷得大,减法可能是负数。要么修复你如何获得数字,要么修复它们的订购方式,或者解决你如何获得它们的不同之处;其中任何一个都可以胜任。
答案 3 :(得分:0)
既然你知道结果必须是正面的,我会从结果开始
int total = r.nextInt(MAX) + 1;
int num2 = r.nextInt(MAX - total + 1);
int num1 = total + num2;
通过这种方式,您可以确保num1 - num2
始终为正。
答案 4 :(得分:0)
程序核心的代码是错误的:
// get two random numbers between 1 and MAX
int num1 = r.nextInt(MAX) - 1;
int num2 = r.nextInt(MAX) - 1;
r.nextInt(MAX)
返回0(含)和MAX
之间的数字(不包括)。您的代码从中减去,因此您可以获得[−1, MAX−2]
范围内的数字。
由于您希望它是一个简单的减法,其中所有数字都在[1, MAX]
范围内,您必须以这种方式生成它们。减法的一般形式是:
result = num1 − num2
该等式具有以下约束:
1 <= result <= MAX
1 <= num1 <= MAX
1 <= num2 <= MAX
result < MAX
,否则num2
必须是0
1 < num1
,否则结果将变为否定num2 < MAX
,否则result
必须大于MAX
这留下了以下允许的范围:
1 <= result <= MAX − 1
2 <= num1 <= MAX
1 <= num2 <= MAX − 1
num2 <= num1 - 1
要生成这些数字,代码必须如下所示:
int num1 = randomBetween(2, MAX);
int maxNum2 = Math.min(MAX - 1, num1 - 1);
int num2 = randomBetween(1, maxNum2);
现在什么是randomBetween
?你必须定义它:
randomBetween(min, max) ≡ r.nextInt(max + 1 - min) + min
这是:
int num1 = r.nextInt(MAX + 1 - 2) + 2;
int maxNum2 = Math.min(MAX - 1, num1 - 1);
int num2 = r.nextInt(maxNum2 + 1 - 1) + 1;
int result = num1 - num2;
assert 1 <= result && result <= MAX;
答案 5 :(得分:-1)
package optinalTest;
import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;
public class Subtraction {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
randomNumber();
}
}
private static void randomNumber() {
// get two random numbers between 1 and MAX
int num1 = ThreadLocalRandom.current().nextInt(10000, 9999998);
int num2 = ThreadLocalRandom.current().nextInt(num1 + 1, 9999999);
int total = (num2 - num1);
// display a question
System.out.printf("What is your answer to %d - %d = ?%n", num2, num1);
// read in the result
Scanner stdin = new Scanner(System.in);
int ans = stdin.nextInt();
stdin.nextLine();
// give an reply
if (ans == total) {
System.out.println("You are correct!");
} else {
System.out.println("Sorry, wrong answer!");
System.out.printf("The answer is %d - %d = %d%n", num2, num1, (num2 - num1));
}
}
}