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+matplotlib实现填充螺旋实例
Jan 15 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
Tensorflow使用支持向量机拟合线性回归
Sep 07 Python
对python中类的继承与方法重写介绍
Jan 20 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
Python进行特征提取的示例代码
Oct 15 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 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自动给文章加关键词链接的函数代码
2012/11/29 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python实现批量下载图片的方法
2015/07/08 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
python中requests库session对象的妙用详解
2017/10/30 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
Python加速程序运行的方法
2020/07/29 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
原装进口全世界:天猫国际
2016/08/03 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
安全资料员岗位职责
2013/12/14 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
产品生产计划书
2014/05/07 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL