一步步解析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计算斗牛游戏的概率相关内容,希望对大家的学习有所帮助。