您的位置:首页 > 编程语言 > Python开发

骰子游戏的概率计算

2014-11-29 22:23 585 查看
昨天跟朋友们喝酒,玩掷骰子游戏,游戏规则是这样的:

每人有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


两个参数x,y,输出一共x个骰子,至少扔出y个指定点数的概率
先来试验一下



貌似是对的

然后来算一下30个骰子,至少扔出11个指定点数的概率



我去,千分之六,当时我就震惊了,还真是个小概率事件

我是个数学渣,也不知道这概率算的对不对,求概率帝指教

如果真是这个数,下次再玩骰子知道怎么办了吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息