程序描述:骰子玩家有一种信仰,认为在掷三个骰子时,得到十比得到九更容易。你能写一个程序来证明或反驳这种信仰吗?
让计算机计算扔三个骰子的所有可能方式:1 + 1 + 1,1 + 1 + 2,1 + 1 + 3等。将每个可能性相加,看看有多少个结果为9,有多少个结果为10。如果有更多的结果为10,则证明了这种信仰。
我很快想出了一种暴力解决方案,如下所示:
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个骰子得到特定数字的方法数。因此,我开始生成使用n个骰子获得每个总和的方法数。对于1个骰子,显然有1种解决方案。然后,我通过暴力破解计算了使用2个和3个骰子的组合。这些是两个骰子的结果:
Which looks straightforward enough; it can be calculated with a simple linear absolute value function. But then things start getting trickier. With 3:
所以我看到这个,想:酷,三角形数!然后,我注意到那些讨厌的25和27。因此,它显然不是三角形数,但仍然是一些多项式扩展,因为它是对称的。掷出3的方法有1种
掷出4的方法有3种
掷出5的方法有6种
掷出6的方法有10种
掷出7的方法有15种
掷出8的方法有21种
掷出9的方法有25种
掷出10的方法有27种
掷出11的方法有27种
掷出12的方法有25种
掷出13的方法有21种
掷出14的方法有15种
掷出15的方法有10种
掷出16的方法有6种
掷出17的方法有3种
掷出18的方法有1种
于是我去谷歌,找到了这个页面,详细介绍了如何用数学方法解决这个问题。使用重复导数或扩展很容易(尽管很长)找到这个结果,但对我来说编程会更难。我没有完全理解第二个和第三个答案,因为我之前的数学学习中从未遇到过那种符号或概念。有人能否解释一下如何编写程序来解决这个问题,或者解释该页面上给出的解决方案,以便我更好地理解组合数学?
编辑:我正在寻找一种数学方法来解决这个问题,可以得到一个精确的理论数字,而不是通过模拟骰子。