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读取csv文件示例(python操作csv)
Mar 11 Python
Python3基础之基本数据类型概述
Aug 13 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
Python设计模式之门面模式简单示例
Jan 09 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
keras slice layer 层实现方式
Jun 11 Python
Python logging自定义字段输出及打印颜色
Nov 30 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
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
javascript编写简易计算器
2017/05/06 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
小程序自定义日历效果
2018/12/29 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
Python中基础的socket编程实战攻略
2016/06/01 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
python 连接各类主流数据库的实例代码
2018/01/30 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Python 高效编程技巧分享
2020/09/10 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
总经理驾驶员岗位职责
2013/12/04 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
创先争优一句话承诺
2014/05/29 职场文书
工作表扬信
2015/01/17 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
演讲比赛主持词
2015/06/29 职场文书