减去随机数

时间:2016-04-21 17:16:16

标签: java random

我制作的游戏中用户必须解决一个简单的减法,但结果必须是正整数。我设法做了一切,但由于某种原因,答案有时是消极的,我不知道如何解决它

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));
    }

  }
}

6 个答案:

答案 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));
        }
    }
}