用 Java 打印骰子组合

时间:2021-02-04 23:06:35

标签: java statistics

对于一个项目,我需要找到一种方法来打印每一种方式来滚动 5 个 6 面骰子,顺序不重要。我尝试过使用嵌套的 for 循环,但我知道这是打印排列而不是组合:

int counter = 0;
        for(int i=1; i<7; i++) {
            
            for(int m = 1; m<7; m++) {
                
                for(int j = 1; j<7; j++) {
                    
                    for(int k = 1; k<7; k++) {
                        
                        for(int h = 1; h<5; h++) {
                            System.out.printf("%2d%2d%2d%2d%2d",i,m,j,k,h);
                            counter++;
                            System.out.println(" "+counter);
                        }
                    }
                }
            }
        }

有没有有效的方法来做到这一点?

编辑:我应该补充一点,这是针对 Java 的!谢谢!

再次编辑:是的,我的意思是 5 个骰子,每个骰子有 6 个面。抱歉造成混乱

2 个答案:

答案 0 :(得分:1)

如果顺序不重要,请尝试:

for (int i = 1; i < 7; i++) {
    for (int m = i; m < 7; m++) {
        for (int j = m; j < 7; j++) {
            ...

所有骰子都一样,发布的代码只显示第一个 3 个
也就是说,初始值永远不会小于前一个骰子的值 - 结果将被排序。
(例如,仅考虑 2 个骰子,这将消除2 13 1 这样的结果,但允许 1 1 1 2 和 {{1 }})


注意:更容易阅读 (IMO):1 3

答案 1 :(得分:0)

考虑这个带有两个六面骰子的简化示例:

for (int i = 1; i <= 6; i++)
    for (int j = 1; j <= 6; j++)
        System.out.println(i + " " + j);

这将输出 36 (6^2) 个组合。但很多都是重复的。例如,一对数1 22 1基本相同。如果您只能计算 UNIQUE 对怎么办?在运行上述代码时列出的 36 个对中,只有 21 个是唯一的组合。那么,你会怎么做呢?

for (int i = 1; i <= 6; i++)
    for (int j = i; j <= 6; j++)
        System.out.println(i + " " + j);

在内部循环中,我以 i 而不是 1 的值开始每次迭代。这是做什么的?在第一次迭代中,您将只打印出唯一的对。但是,在随后的迭代中,我需要消除一个已经滚动的数字。我通过使用 i 的当前起始值启动内循环来做到这一点。这保证没有重复的对。例如,在第二次迭代中,我通过从当前 i 值 2 开始来消除“1”的值;它消除了重复的 2 1 对,并以 2 2 开始第二轮。到最后一次迭代时,只会打印出剩下的唯一一对:6 6

这很简单。但是,添加另一个骰子如何影响解决方案?采取同样的方法。使用直接外循环的计数器变量的值开始最内层循环,如下所示:

for (int i = 1; i <= 6; i++)
    for (int j = i; j <= 6; j++)
        for (int k = j; k <= 6; k++)
            System.out.println(i + " " + j + " " + k);

此解决方案仅打印出 56 个组合,而不是 216 个 (6^3)。这是一个巨大的性能改进。用更多的内循环来预测改进。

相关问题