计算掷出一定数量的方式数量
我是一名高中计算机科学专业的学生,今天我遇到了一个问题:
程序描述:骰子玩家有一种信念,即掷出三个骰子,一个十比一个九更容易得到。你能写一个程序来证明或反驳这种信念吗?
让计算机计算所有可能的方式可以投掷三个骰子:1 + 1 + 1,1 + 1 + 2,1 + 1 + 3等。将这些可能性中的每一种相加,看看有多少人给出九个作为结果,有多少人给出十个。如果更多的人给十个,那么这个信念就被证明了。
我很快就想出了一个蛮力解决方案,这样
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骰子的组合。这些是两个:
有1种滚动方法 2
有2种滚动方法 3
滚动方法 4滚动方法 4
滚动方法 5滚动方法 6
滚动方法 6
滚动方法 7
有5种滚动方法 8
有4种滚动方法 a 9
有3种滚动方法 a 10
有2种方法滚 11
的方法 有 12 滚 12 的方法
这看起来很简单;它可以使用简单的线性绝对值函数进行计算。但后来事情开始变得越来越棘手。含 3:
有1种滚动方法 3
有3种滚动方式 4
有6种滚动方式 5
有10种滚动方式 6
有15种滚动方式 7
有21种滚动方式 a 8
有25种滚动方式 a 9
有27种滚动方式 10
有27种滚动方式 11
有25种滚动方式滚动方法 a 12
有 21 种滚动方法 13
有 15 种滚动方法 14
有 10 种滚动方法 15
有 6 种滚动方法 16
有 3 种滚动方法 17
滚动方法 18
所以我看着它,我想:很酷,三角形的数字!但是,我注意到那些讨厌的25s和27s。所以它显然不是三角形数,而是一些多项式展开,因为它是对称的。
所以我去了谷歌,我遇到了这个页面,里面有关于如何用数学做到这一点的细节。使用重复的导数或扩展来找到它相当容易(尽管很长),但是对我来说编程要困难得多。我不太理解第二和第三个答案,因为我以前从未在数学研究中遇到过这种符号或那些概念。有人可以解释一下我如何编写一个程序来做到这一点,或者解释该页面上给出的解决方案,以便我自己理解组合学吗?
编辑:我正在寻找一种数学方法来解决这个问题,给出一个精确的理论数字,而不是通过模拟骰子