首页 > 解决方案 > 我的“Yahtzee”代码有时会抛出一个随机数

问题描述

好吧,所以基本上我想制作一个代码,它会生成数字,直到它第一次尝试完美的“Yahtzee”。有时它不起作用,而且我对编码还很陌生(这就是为什么这是令人厌恶的),甚至对 SO 也很陌生。我这样做只是为了教育,但我不明白为什么有时它不起作用。大约 20% 的时间,它不会说“11111”,而是随机说“11114”。帮帮我?

public class IDontKnowWhatImDoing {

public static void main(String[] args) {
    int min = 1;
    int max = 6;
    
    int randomInt1 = (int)(Math.random() * (max - min + 1) + min);
    int randomInt2 = (int)(Math.random() * (max - min + 1) + min);
    int randomInt3 = (int)(Math.random() * (max - min + 1) + min);
    int randomInt4 = (int)(Math.random() * (max - min + 1) + min);
    int randomInt5 = (int)(Math.random() * (max - min + 1) + min);
    while(randomInt1 != randomInt2) {
        randomInt1 = (int)(Math.random() * (max - min + 1) + min);
        randomInt2 = (int)(Math.random() * (max - min + 1) + min);
        randomInt3 = (int)(Math.random() * (max - min + 1) + min);
        randomInt4 = (int)(Math.random() * (max - min + 1) + min);
        randomInt5 = (int)(Math.random() * (max - min + 1) + min);
        System.out.println(randomInt1);
        System.out.println(randomInt2);
        System.out.println(randomInt3);
        System.out.println(randomInt4);
        System.out.println(randomInt5);
        System.out.println();
        while(randomInt2 != randomInt3) {
            randomInt1 = (int)(Math.random() * (max - min + 1) + min);
            randomInt2 = (int)(Math.random() * (max - min + 1) + min);
            randomInt3 = (int)(Math.random() * (max - min + 1) + min);
            randomInt4 = (int)(Math.random() * (max - min + 1) + min);
            randomInt5 = (int)(Math.random() * (max - min + 1) + min);
            System.out.println(randomInt1);
            System.out.println(randomInt2);
            System.out.println(randomInt3);
            System.out.println(randomInt4);
            System.out.println(randomInt5);
            System.out.println();
            while(randomInt3 != randomInt4) {
                randomInt1 = (int)(Math.random() * (max - min + 1) + min);
                randomInt2 = (int)(Math.random() * (max - min + 1) + min);
                randomInt3 = (int)(Math.random() * (max - min + 1) + min);
                randomInt4 = (int)(Math.random() * (max - min + 1) + min);
                randomInt5 = (int)(Math.random() * (max - min + 1) + min);
                System.out.println(randomInt1);
                System.out.println(randomInt2);
                System.out.println(randomInt3);
                System.out.println(randomInt4);
                System.out.println(randomInt5);
                System.out.println();
                while(randomInt4 != randomInt5) {
                    randomInt1 = (int)(Math.random() * (max - min + 1) + min);
                    randomInt2 = (int)(Math.random() * (max - min + 1) + min);
                    randomInt3 = (int)(Math.random() * (max - min + 1) + min);
                    randomInt4 = (int)(Math.random() * (max - min + 1) + min);
                    randomInt5 = (int)(Math.random() * (max - min + 1) + min);
                    System.out.println(randomInt1);
                    System.out.println(randomInt2);
                    System.out.println(randomInt3);
                    System.out.println(randomInt4);
                    System.out.println(randomInt5);
                    System.out.println();
                }
            }
        }
    }
}

}

标签: javamath

解决方案


问题在于您用来检查是否有相同数字的五个的条件。如果某个条件已经为假(数字匹配),则不要输入该外观。

例如,如果您随机生成五个数字,其中前两个恰好相等,那么randomInt1 != randomInt2将是错误的。然后,您将永远不会进入该while(randomInt1 != randomInt2)块,并以最初的一组数字退出,即使您只检查了前两个是否相等,而不是其他 3。这个问题存在于嵌套循环的每一级。


直接的解决方案是改用do-while循环(并删除第一个数字生成器块)。这允许每对数字至少被检查一次。


然而,这是一个不雅的解决方案。假设您仍然希望每次生成五个数字(如在 Yahtzee 中,而不是像一次生成一个骰子这样更简单的东西),那么使用单个do-while循环会更干净。在这种情况下,您可以有一个随机数调用块,而不是不同嵌套级别的冗余调用。条件将让它继续循环,直到所有 5 个都相等。


推荐阅读