Python计算斗牛游戏概率算法实例分析
本文实例讲述了Python计算斗牛游戏概率算法。分享给大家供大家参考,具体如下:
过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛。在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率)。
斗牛的玩法是:
1.把牌中的JQK都拿出来
2.每个人发5张牌
3.如果5张牌中任意三张加在一起是10的倍数,就是有牛。剩下两张牌的和的10的余数就是牛数。
牌的大小:
4条>3条>牛十>牛九>……>牛一>没有牛
而这些牌出现的概率是有多少呢?
由于只有四十张牌,所以采用了既简单,又有效率的方法枚举来计算。
计算的结果:
所有牌的组合数:658008 出现四条的组合数:360,概率:0.05% 出现三条的组合数:25200,概率:3.83% 出现牛十的组合数:42432,概率:6.45% 出现牛九或牛八的组合数:87296,概率:13.27% 出现牛一到牛七的组合数:306112,概率:46.52% 出现没有牛的组合数:196608,概率:29.88%
所以有七成的概率是有牛或以上的,所以如果你经常遇到没有牛,说明你的运气非常差或者本来是有牛的,但是你没有找出来。
Python源代码:
#encoding=utf-8
__author__='kevinlu1010@qq.com'
importos
importcPickle
fromcopyimportcopy
fromcollectionsimportCounter
importitertools
'''
计算斗牛游戏的概率
'''
classPoker():
'''
一张牌
'''
def__init__(self,num,type):
self.num=num#牌数
self.type=type#花色
classGamePoker():
'''
一手牌,即5张Poker
'''
COMMON_NIU=1#普通的牛,即牛一-牛七
NO_NIU=0#没有牛
EIGHT_NINE_NIU=2#牛九或牛八
TEN_NIU=3#牛十
THREE_SAME=4#三条
FOUR_SAME=5#四条
def__init__(self,pokers):
assertlen(pokers)==5
self.pokers=pokers
self.num_pokers=[p.numforpinself.pokers]
#self.weight=None#牌的权重,权重大的牌胜
#self.money_weight=None#如果该牌赢,赢钱的权重
self.result=self.sumary()
defis_niu(self):
'''
是否有牛
:return:
'''
#ifself.is_three_same():
#return0
forthreeinitertools.combinations(self.num_pokers,3):
ifsum(three)%10==0:
left=copy(self.num_pokers)
foriteminthree:
left.remove(item)
point=sum(left)%10
return10ifpoint==0elsepoint
return0
defis_three_same(self):
'''
是否3条
:return:
'''
#ifself.is_four_same():
#return0
count=Counter([p.numforpinself.pokers])
fornumincount:
ifcount[num]==3:
returnnum
return0
defis_four_same(self):
'''
是否4条
:return:
'''
count=Counter([p.numforpinself.pokers])
fornumincount:
ifcount[num]==4:
returnnum
return0
defsumary(self):
'''
计算牌
'''
ifself.is_four_same():
returnGamePoker.FOUR_SAME
ifself.is_three_same():
returnGamePoker.THREE_SAME
niu_point=self.is_niu()
ifniu_pointin(8,9):
returnGamePoker.EIGHT_NINE_NIU
elifniu_point==10:
returnGamePoker.TEN_NIU
elifniu_point>0:
returnGamePoker.COMMON_NIU
else:
returnGamePoker.NO_NIU
defget_all_pokers():
'''
生成所有的Poker,共四十个
:return:
'''
pokers=[]
foriinrange(1,11):
forjin('A','B','C','D'):
pokers.append(Poker(i,j))
returnpokers
defget_all_game_poker(is_new=0):
'''
生成所有game_poker
:parampokers:
:return:
'''
pokers=get_all_pokers()
game_pokers=[]
ifnotis_newandos.path.exists('game_pokers'):
withopen('game_pokers','r')asf:
returncPickle.loads(f.read())
forpokersinitertools.combinations(pokers,5):#5代表五张牌
game_pokers.append(GamePoker(pokers))
withopen('game_pokers','w')asf:
f.write(cPickle.dumps(game_pokers))
returngame_pokers
defprint_rate(game_pokers):
total_num=float(len(game_pokers))
four_num=len([game_pokerforgame_pokeringame_pokersifgame_poker.result==GamePoker.FOUR_SAME])
three_num=len([game_pokerforgame_pokeringame_pokersifgame_poker.result==GamePoker.THREE_SAME])
ten_num=len([game_pokerforgame_pokeringame_pokersifgame_poker.result==GamePoker.TEN_NIU])
eight_nine_num=len([game_pokerforgame_pokeringame_pokersifgame_poker.result==GamePoker.EIGHT_NINE_NIU])
common_num=len([game_pokerforgame_pokeringame_pokersifgame_poker.result==GamePoker.COMMON_NIU])
no_num=len([game_pokerforgame_pokeringame_pokersifgame_poker.result==GamePoker.NO_NIU])
print'所有牌的组合数:%d'%total_num
print'出现四条的组合数:%d,概率:%.2f%%'%(four_num,four_num*100/total_num)
print'出现三条的组合数:%d,概率:%.2f%%'%(three_num,three_num*100/total_num)
print'出现牛十的组合数:%d,概率:%.2f%%'%(ten_num,ten_num*100/total_num)
print'出现牛九或牛八的组合数:%d,概率:%.2f%%'%(eight_nine_num,eight_nine_num*100/total_num)
print'出现牛一到牛七的组合数:%d,概率:%.2f%%'%(common_num,common_num*100/total_num)
print'出现没有牛的组合数:%d,概率:%.2f%%'%(no_num,no_num*100/total_num)
defmain():
game_pokers=get_all_game_poker()#658008种
print_rate(game_pokers)
main()
如果有错误,欢迎指正。
更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《PythonSocket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。