骰子游戏的概率计算
昨天跟朋友们喝酒,玩掷骰子游戏,游戏规则是这样的:
每人有5个骰子,摇完之后自己可以看,不要让别人知道,然后按顺序轮流叫数,比如x个y,就是说场上所有骰子,为y的至少要有x个,下一个人可以选择继续叫或者摊牌,如果继续叫,那么两个数至少要有一个比前一个人的大,比如前一个人10个③,那你可以叫10个④或者11个①;如果选择摊牌,就来算场上的y是不是大于等于x个,如果是,那么摊牌的人喝酒,如果少于x个,那刚才叫x个y的人喝酒。
我虽然没喝多少,但对这个游戏的规则有点想不明白,因为我们玩的时候有个规则是第一个叫数的人叫的x至少为当前人数的2n-1个,就是说如果有6个人玩,第一个人最少要叫11个y。不知道别人玩的时候第一个人最少要叫多少,但是仔细想想,6个人场上一共只有30个骰子,每个骰子扔出指定数的概率是1/6,那么30个骰子中等于指定数的骰子的个数的平均期望值为30*1/6=5个。也就是说30个骰子随机的扔,平均只有5个骰子会扔出指定点数,那要求扔出11个岂不是一个小概率事件?作为第二个人,每次都不继续叫而选择直接摊牌的话岂不是就能立于不败之地?(不过这要忽略叫数的人的底牌,不过他只有5个骰子,对局面的影响也不大)
回家后我就想算算究竟30个骰子扔出11个指定点数的概率是多少。用计算器的话,太麻烦了,如果写段程序来算,应该很快。手头电脑上要直接执行一小段代码最方便的就是python了,无奈我又不会python,只好打开learn X in Y minutes现学了。
先来看看这个概率怎么算,假设指定点数为⑥,有m个骰子,要求扔出n个⑥(用^表示乘方)
1.每个骰子可以扔出6种可能,m个骰子,可以扔出的组合共有6^m种
2.n个骰子点数都为6,只有1种组合,剩下的m-n个骰子点数都不为6,每个骰子可以有5种可能,共有5^(m-n)种组合,乘以1,还是5^(m-n)种组合
3.m个骰子,随机取出n个,组合数为(m*(m-1)*(m-2)*...*n)/n*(n-1)*(n-2)*...*1
用3的结果乘以2的结果再除以1的结果就是m个骰子,扔出n个⑥的概率
要计算扔出的⑥的个数不少于n的概率,只要计算n个⑥的概率加上n+1个⑥的概率一直加到m个⑥就行了。
最后用python写出的程序
import sys import string total = string.atoi(sys.argv[1]) request = string.atoi(sys.argv[2]) def factorial(max,min=1): ret = max for i in range(min,max): ret = ret * i return ret def calculate(t,r): return ((5.0**(t-r))/(6.0**t)) * factorial(t,t-r+1) / factorial(r) result = 0 for i in range(request,total+1): result = result + calculate(total,i) print result
先来试验一下
貌似是对的
然后来算一下30个骰子,至少扔出11个指定点数的概率
我去,千分之六,当时我就震惊了,还真是个小概率事件
我是个数学渣,也不知道这概率算的对不对,求概率帝指教
如果真是这个数,下次再玩骰子知道怎么办了吧