java - java中的骰子求和应用程序。我遇到索引错误并且我设计了错误的代码但我不知道在哪里

标签 java

package HomePlace;

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

public class DiceRolls {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        System.out.print("How many sides? ");
        int Usides = input.nextInt();
        System.out.print("How many dice to roll? ");
        int Udices = input.nextInt();
        System.out.print("How many rolls? ");
        int Urolls = input.nextInt();
        int[] outcomes = new int[Usides * Udices];


        for (int rolls = 0; rolls < Urolls; rolls++) {
            outcomes[sum(Usides, Udices)] += 1;
        }
        for (int i = Udices; i <= Urolls; i++) {
            System.out.println(i + ": " + outcomes[i-1]);
        }

    }

    public static int sum(int Us, int Ud) {
        int dicesum = 0;
        for (int i = 0; i <= Ud; i++) {
            int dots = (int) (Math.random() * Us + 1);
            dicesum += dots;

        }
        return dicesum;

    }

}

在这段代码中,用户声明有多少面(骰子)、多少个骰子(骰子数量)以及用户将执行多少次掷骰。 例如,如果用户选择骰子有 3 个面,则变量将为 1~3 如果用户输入 5 个骰子并掷 5 次,则将掷 5 个(3 面)骰子 5 次。 我的输出应该显示可能的总和以及该总和出现的次数。例如,如果我扔 2 个 6 面骰子 2 次,输出应该计算每次掷骰子的总和数。

现在我的问题是我收到错误

    How many sides? 3
How many dice to roll? 4
How many rolls? 5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 12 out of bounds for length 12
    at HomePlace.DiceRolls.main(DiceRolls.java:21)

如果我输入大量内容

How many sides? 123
How many dice to roll? 123
How many rolls? 123
123: 0

我只得到这个输出。我想要的输出是

How many sides on the die? 7

How many dice to roll? 5

How many rolls? 100

5: 0

6: 0

7: 0

8: 0

9: 1

10: 1

11: 2

12: 0

13: 2

14: 5

15: 9

16: 5

17: 4

18: 2

19: 9

20: 6

21: 8

22: 11

23: 10

24: 7

25: 6

26: 5

27: 2

28: 1

29: 3

30: 1

31: 0

32: 0

33: 0

34: 0

35: 0

显然我在该代码中做错了什么......我可以获得帮助吗?

最佳答案

以问题中的第一个样本为例,即四个骰子,每个骰子有三个面,并且您将所有四个骰子总共掷五次。

当每个骰子落在 1(一)上时,最小结果将为 4,即最小结果等于骰子总数。

当每个骰子落在 3(三)上时,最大结果将为 12,即最大结果是骰子数量乘以每个骰子的面数。

数组outcomes存储每个结果的频率。因此数组的大小需要是可能结果的数量。使用上面的示例,大小需要为 9,即 12 - 4 + 1,或者换句话说,最大结果减去最小结果加 1。

方法 main() 中的第一个 for 循环执行掷骰子并调整数组 outcomes 中的值。您需要将实际结果调整为数组索引。再次使用上面的示例,如果结果是最小值,即 4,那么它对应于 outcomes 中的第一个元素,因此您需要将 4 更改为 0(零)。同样,当结果为 5 时,您想要更新 outcomes 中的第二个元素,因此需要将 5 更改为 1(一)。正如您所看到的,在这两种情况下,您都需要从获得的实际结果中减去最小结果,以获得 outcomes 中需要递增的元素的真实索引。

方法sum()中的for循环需要根据骰子的数量重复。因此,对于四个骰子,循环需要重复四次。所以你可以将循环写成:

for (int i = 1; i <= Ud; i++) {

最后打印结果。您想要显示 outcomes 中的每个元素,但是当您显示元素值时,您需要将最小结果添加到元素索引,因为正如我上面所写,数组 中的元素 0(零) >结果实际上意味着最低结果。

这是代码。我添加了更多 print() 方法,以便您可以看到代码正在做什么。

import java.util.Scanner;

public class DiceRolls {
    public static int sum(int Us, int Ud) {
        int dicesum = 0;
        for (int i = 1; i <= Ud; i++) {
            int dots = (int) (Math.random() * Us + 1);
            System.out.printf("dice %d landed on %d%n", i, dots);
            dicesum += dots;
        }
        return dicesum;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("How many sides? ");
        int Usides = input.nextInt();
        System.out.print("How many dice to roll? ");
        int Udices = input.nextInt();
        System.out.print("How many rolls? ");
        int Urolls = input.nextInt();
        int maximumOutcome = Udices * Usides;
        int[] outcomes = new int[maximumOutcome - Udices + 1];
        System.out.printf("Outcomes for %d rolls of %d, %d-sided dice.%n", Urolls, Udices, Usides);
        for (int rolls = 1; rolls <= Urolls; rolls++) {
            System.out.printf("%nRoll %d:%n", rolls);
            int sum = sum(Usides, Udices);
            System.out.printf("Total: %d%n", sum);
            outcomes[sum - Udices]++;
        }
        System.out.println("====================================================================");
        System.out.println("Outcomes: ");
        for (int i = 0; i < outcomes.length; i++) {
            System.out.println((i + Udices) + ": " + outcomes[i]);
        }
    }
}

关于java - java中的骰子求和应用程序。我遇到索引错误并且我设计了错误的代码但我不知道在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62368240/

相关文章:

java.lang.NoSuchMethodError : putMemberOffset

java - JTextArea 的行号和调整 JTextArea 文本大小的问题

尝试使用 Apache POI 读取 MapReduce 中的 Word 文档时出现 Java.lang.ClassNotFoundException 错误

从 jar 文件夹加载 Java rxtxSerial.dll

java - Android - 从 MainActivity 调用方法到 Fragment

java - 从同级项目中提取类的子集

java - 任何人都可以解释以下代码的工作......?

java - 自动调整大小的棋盘

java - JSF 1.2 - 使用 <h :dataTable> 为表生成动态 ID 属性

java - 使用JAVA进行PDF注释