骰子游戏的概率计算
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写出的程序
两个参数x,y,输出一共x个骰子,至少扔出y个指定点数的概率
先来试验一下
貌似是对的
然后来算一下30个骰子,至少扔出11个指定点数的概率
我去,千分之六,当时我就震惊了,还真是个小概率事件
我是个数学渣,也不知道这概率算的对不对,求概率帝指教
如果真是这个数,下次再玩骰子知道怎么办了吧
每人有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个指定点数的概率
我去,千分之六,当时我就震惊了,还真是个小概率事件
我是个数学渣,也不知道这概率算的对不对,求概率帝指教
如果真是这个数,下次再玩骰子知道怎么办了吧
相关文章推荐
- 骰子游戏的概率计算
- 蓝桥杯算法提高——概率计算(概率dp)
- POJ2005解题报告 计算概率
- 剑指offer43-计算n个色子掷出各个点数和的概率
- mysql 查询随机条记录的sql语句和php计算概率
- [蓝桥杯]算法提高 概率计算
- python 生日悖论概率计算。
- 概率计算 PHP幸运星
- 条件随机场(2)——概率计算
- CodeForces 464D World of Darkraft - 2 概率DP 近似计算
- n个骰子 点数和 概率计算
- 【C++运用】(控制台)-概率的运用,石头剪刀布,抛硬币,圆周率的计算---ShinePans
- Python计算斗牛游戏的概率
- 基于B-gram句子概率计算实现
- 算法提高 概率计算
- 算法提高 概率计算
- 概率计算
- 双色球概率能到1/14获奖已经最大了。我们都是54青年,我们的数学概率计算,而且他们还会破产。
- 蓝桥杯_算法提高_概率计算(动态规划)
- 【笔试/面试】排列组合与概率计算(二)