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 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
Python isinstance函数介绍
Apr 14 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
python3.5绘制随机漫步图
Aug 27 Python
Python之inspect模块实现获取加载模块路径的方法
Oct 16 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
python利用pandas分析学生期末成绩实例代码
Jul 09 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
一个域名查询的程序
2006/10/09 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
js实现时间日期校验
2020/05/26 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
python简单实例训练(21~30)
2017/11/15 Python
Python3离线安装Requests模块问题
2019/10/13 Python
Python中os模块功能与用法详解
2020/02/26 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
携程英文网站:Trip.com
2017/02/07 全球购物
党风廉政建设责任书
2014/04/14 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers