Python计算斗牛游戏概率算法实例分析


Posted in Python onSeptember 26, 2017

本文实例讲述了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'
import os
import cPickle
from copy import copy
from collections import Counter
import itertools
'''
计算斗牛游戏的概率
'''
class Poker():
  '''
  一张牌
  '''
  def __init__(self, num, type):
    self.num = num # 牌数
    self.type = type # 花色
class GamePoker():
  '''
  一手牌,即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):
    assert len(pokers) == 5
    self.pokers = pokers
    self.num_pokers = [p.num for p in self.pokers]
    # self.weight = None # 牌的权重,权重大的牌胜
    # self.money_weight = None # 如果该牌赢,赢钱的权重
    self.result = self.sumary()
  def is_niu(self):
    '''
    是否有牛
    :return:
    '''
    # if self.is_three_same():
    # return 0
    for three in itertools.combinations(self.num_pokers, 3):
      if sum(three) % 10 == 0:
        left = copy(self.num_pokers)
        for item in three:
          left.remove(item)
        point = sum(left) % 10
        return 10 if point == 0 else point
    return 0
  def is_three_same(self):
    '''
    是否3条
    :return:
    '''
    # if self.is_four_same():
    # return 0
    count = Counter([p.num for p in self.pokers])
    for num in count:
      if count[num] == 3:
        return num
    return 0
  def is_four_same(self):
    '''
    是否4条
    :return:
    '''
    count = Counter([p.num for p in self.pokers])
    for num in count:
      if count[num] == 4:
        return num
    return 0
  def sumary(self):
    '''
    计算牌
    '''
    if self.is_four_same():
      return GamePoker.FOUR_SAME
    if self.is_three_same():
      return GamePoker.THREE_SAME
    niu_point = self.is_niu()
    if niu_point in (8, 9):
      return GamePoker.EIGHT_NINE_NIU
    elif niu_point == 10:
      return GamePoker.TEN_NIU
    elif niu_point > 0:
      return GamePoker.COMMON_NIU
    else:
      return GamePoker.NO_NIU
def get_all_pokers():
  '''
  生成所有的Poker,共四十个
  :return:
  '''
  pokers = []
  for i in range(1, 11):
    for j in ('A', 'B', 'C', 'D'):
      pokers.append(Poker(i, j))
  return pokers
def get_all_game_poker(is_new=0):
  '''
  生成所有game_poker
  :param pokers:
  :return:
  '''
  pokers = get_all_pokers()
  game_pokers = []
  if not is_new and os.path.exists('game_pokers'):
    with open('game_pokers', 'r') as f:
      return cPickle.loads(f.read())
  for pokers in itertools.combinations(pokers, 5): # 5代表五张牌
    game_pokers.append(GamePoker(pokers))
  with open('game_pokers', 'w') as f:
    f.write(cPickle.dumps(game_pokers))
  return game_pokers
def print_rate(game_pokers):
  total_num = float(len(game_pokers))
  four_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.FOUR_SAME])
  three_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.THREE_SAME])
  ten_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.TEN_NIU])
  eight_nine_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.EIGHT_NINE_NIU])
  common_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.COMMON_NIU])
  no_num = len([game_poker for game_poker in game_pokers if game_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)
def main():
  game_pokers = get_all_game_poker() # 658008种
  print_rate(game_pokers)
main()

如果有错误,欢迎指正。

更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
分享Python开发中要注意的十个小贴士
Aug 30 Python
Python 递归函数详解及实例
Dec 27 Python
python实现求最长回文子串长度
Jan 22 Python
python flask安装和命令详解
Apr 02 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
django rest framework 自定义返回方式
Jul 12 Python
90行Python代码开发个人云盘应用
Apr 20 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 #Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 #Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 #Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 #Python
python九九乘法表的实例
Sep 26 #Python
Python实现简单的HttpServer服务器示例
Sep 25 #Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 #Python
You might like
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
php遍历CSV类实例
2015/04/14 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
JavaScript的eval JSON object问题
2009/11/15 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
详解JS函数重载
2014/12/04 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
python如何实现excel数据添加到mongodb
2015/07/30 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
python中常用的九种预处理方法分享
2016/09/11 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python素数筛选法浅析
2018/03/19 Python
Python中修改字符串的四种方法
2018/11/02 Python
Python 处理图片像素点的实例
2019/01/08 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
学校教师安全责任书
2014/07/23 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
党员个人年度总结
2015/02/14 职场文书
毕业生学校组织意见
2015/06/04 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书