※ 引述《o07608 (无良记者)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++ 2013
: 问题(Question):
: 我不太确定这种问题能否在这边发问,不过还是会试着尽量详述我的问题与想法
: 这次有个功课,是要写一个能够计算扔n次骰子,出现的点数和的机率
: 比方说,扔一次骰子,点数会有1~6,机率各是1/6
: 扔两次骰子,点数会从2~12,机率则会分别是{1,2,3,4,5,6,5,4,3,2,1}/36
用组合数来试试
掷一次骰子,各种点数的组合数
点数 1 2 3 4 5 6
组合数 1 1 1 1 1 1
掷两次骰子
点数 1 2 3 4 5 6 7 8 9 10 11 12
组合数 0 1 2 3 4 5 6 5 4 3 2 1
假设掷第n次,点数P的组合数有 S(P,n)种
S(P,n) =
S(P-6,n-1) + S(P-5,n-1) + S(P-4,n-1) + S(P-3,n-1) + S(P-2,n-1) + S(P-1,n-1)
例如,掷第3次时,点数8的组合数有:
前两次点数和2,第3次点数6: 1种组合
前两次点数和3,第3次点数5: 2种组合
前两次点数和4,第3次点数4: 3种组合
前两次点数和5,第3次点数3: 4种组合
前两次点数和6,第3次点数2: 5种组合
前两次点数和7,第3次点数2: 6种组合
总计 1+2+3+4+5+6=21种
掷第3次时,点数9的组合有
前两次点数和3,第3次点数5: 2种组合
前两次点数和4,第3次点数4: 3种组合
前两次点数和5,第3次点数3: 4种组合
前两次点数和6,第3次点数2: 5种组合
前两次点数和7,第3次点数2: 6种组合
前两次点数和8,第3次点数1: 5种组合
总计 2+3+4+5+6+5=25种
所以,掷3次骰子的点数与组合数是
点数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
组合数 0 0 1 3 6 10 15 21 25 27 27 25 21 15 10 6 3 1
有了掷3次骰子的结果,可以算出掷4次骰子的组合数
点数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
组合数 0 0 0 1 4 10 20 35 56 80 125 146 125 80 56 35 20 10 4 1
104 140 140 104
由第1次掷骰子开始,用循环算出第2次,第3次...第N次的组合数
然后就可以算出第N次的机率
不过32位元整数会在第12次掷骰子时溢位(6^12 = 2176782336 > 2147483648 = 2^31-1)
超过12次需要用长整数来计算