滚动骰子直到一个值被滚动1000次

k0pti3hp  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(498)

我正在写一个程序,它掷骰子n次,一旦6个可能的结果之一被掷1000000次,它就会停止。结果存储在一个数组中。不幸的是,我的代码没有在正确的时间停止,我认为while循环有问题。

import java.util.Random;

public class Wuerfel {

    public static void main(String[] args) {

        Random randomNumber = new Random();

        int[] rolledNumbers = {0, 0, 0, 0, 0, 0};

        while (rolledNumbers[0] < 1000000 || rolledNumbers[1] < 1000000 || rolledNumbers[2] < 1000000 || rolledNumbers[3] < 1000000 || rolledNumbers[4] < 1000000 || rolledNumbers[5] < 1000000) {

            int roll = randomNumber.nextInt(6) + 1;
            switch (roll) {
                case 1:
                    rolledNumbers[0]++;
                case 2:
                    rolledNumbers[1]++;
                case 3:
                    rolledNumbers[2]++;
                case 4:
                    rolledNumbers[3]++;
                case 5:
                    rolledNumbers[4]++;
                case 6:
                    rolledNumbers[5]++;
            }
        }
    }
}

提前谢谢!

jtjikinw

jtjikinw1#

提示1 true || false || false || false || true 决定为真。当你考虑你的身体状况时,请考虑这个提示 while 循环。

提示2

switch语句在默认情况下失效。所以,如果卷是 1 ,每 rolledNumbers[i] 是递增的,而不仅仅是 rolledNumbers[0] . 添加 break 每一个案例的结尾。或者,考虑如何编写一行代码来完成整个过程中相同的事情 switch block应该完成的。

cygmwpex

cygmwpex2#

以下是基于我最初评论的实现:
提示:当一个值递增时,不需要检查所有边。只检查你刚刚增加的那一面,看看它是否达到1000000。你可以从一段时间变成一段时间。
代码:

public static void main(String[] args) {
    Random randomNumber = new Random();

    int[] rolledNumbers = {0, 0, 0, 0, 0, 0};

    int roll;
    do {
      rolledNumbers[roll = randomNumber.nextInt(6)]++;
    } while (rolledNumbers[roll] < 1000000);

    for(int s=0; s<rolledNumbers.length; s++) {
      System.out.println("Side " + (s+1) + ": " + rolledNumbers[s]);
    }    
    System.out.println("Side " + (roll+1) + " wins!");
  }

样本输出:

Side 1: 999182
Side 2: 999885
Side 3: 1000000
Side 4: 999669
Side 5: 999952
Side 6: 999426
Side 3 wins!

请注意,在这行中:

rolledNumbers[roll = randomNumber.nextInt(6)]++;

我们将一个随机值(介于0和5之间,包括0和5)分配给 roll ,并且该赋值的结果也立即用于访问 rolledNumbers 数组。这是因为java中的赋值也会产生一个“结果”:
在运行时,赋值表达式的结果是赋值后变量的值。赋值表达式的结果本身不是变量。

mtb9vblg

mtb9vblg3#

在while循环条件中,应该使用逻辑运算符&&而不是| |,
并在每个case语句后添加分隔符。

d7v8vwbk

d7v8vwbk4#

当然,如果可以使用switch表达式,那么就不需要 break 在你的 switch .

import java.util.Random;

public class Wuerfel {
    public static void main(String[] args) {
        Random randomNumber = new Random();
        int[] rolledNumbers = {0, 0, 0, 0, 0, 0};
        while (true) {
            int roll = randomNumber.nextInt(6) + 1;
            int index = switch (roll) {
                            case 1 -> 0;
                            case 2 -> 1;
                            case 3 -> 2;
                            case 4 -> 3;
                            case 5 -> 4;
                            case 6 -> 5;
                            default -> -1;
                        };
            if (index >= 0) {
                rolledNumbers[index]++;
                if (rolledNumbers[index] >= 1_000_000) {
                    break;
                }
            }
        }
    }
}

相关问题