我是一名高中计算机科学专业的学生,今天我遇到了一个问题:
程序描述: 掷骰子的人认为掷三个骰子,十比九更容易得到。你能写一个程序来证明或反驳这种信念吗?
让计算机计算所有可能的掷三个骰子的方式:1 + 1 + 1、1 + 1 + 2、1 + 1 + 3 等。将这些可能性中的每一个加起来,看看有多少得到 9 作为结果,多少给十。如果更多给十,那么这个信念就被证明了。
我很快就想出了一个蛮力解决方案,因此
int sum,tens,nines;
tens=nines=0;
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
for(int k=1;k<=6;k++){
sum=i+j+k;
//Ternary operators are fun!
tens+=((sum==10)?1:0);
nines+=((sum==9)?1:0);
}
}
}
System.out.println("There are "+tens+" ways to roll a 10");
System.out.println("There are "+nines+" ways to roll a 9");
效果很好,而蛮力解决方案是老师希望我们做的。但是,它不能扩展,我正在尝试找到一种方法来制作一种算法,该算法可以计算掷骰子以获得特定数字的方式数量。因此,我开始生成用n 个骰子获得每个总和的方法的数量。对于 1 个骰子,显然每个骰子都有 1 个解决方案。然后,我通过蛮力计算了 2 个和 3 个骰子的组合。这是两个:
有 1 种方法 2
有 2 种方法 3
有 3 种方法 4
有 4 种方法 5
有 5 种方法 6
有 6 种方法 7
有掷 8 的 5 种
方法 掷 9 的方法有 4 种
掷 10 的方法有 3 种
掷 11 的方法有 2 种
掷 12 的方法有 1 种
看起来很简单;它可以用一个简单的线性绝对值函数来计算。但随后事情开始变得棘手。3:
有 1 种方式掷 3
有 3 种方式 掷 4
有 6 种方式 掷 5
有 10 种方式 掷 6
有 15 种方式 掷 7
有 21 种方式 掷 8
有掷 9 的 25 种
方法 掷 10
的方法有 27 种 掷 11的方法有 27 种 掷
12 的方法有 25 种
掷 13
的方法有 15 种 掷 14
的方法有 10 种掷15
掷16 有6 种方法
掷17 有3 种方法 掷18
有1 种方法
所以我看着那个,我想:很酷,三角数!但是,然后我注意到那些讨厌的 25 和 27。所以它显然不是三角数,而是一些多项式展开,因为它是对称的。
所以我去了谷歌,我遇到了这个页面,其中详细介绍了如何用数学来做到这一点。使用重复的导数或扩展来找到它相当容易(虽然很长),但对我来说编程要困难得多。我不太明白第二个和第三个答案,因为我以前在数学学习中从未遇到过这种符号或那些概念。有人可以解释我如何编写一个程序来做到这一点,或者解释该页面上给出的解决方案,以了解我自己对组合学的理解吗?
编辑:我正在寻找一种数学方法来解决这个问题,它给出了一个准确的理论数字,而不是通过模拟骰子