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共享引用(多个变量引用)示例代码
Dec 04 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
python 异或加密字符串的实例
Oct 14 Python
Python异常的检测和处理方法
Oct 26 Python
Python给图像添加噪声具体操作
Mar 03 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
Python表达式的优先级详解
Feb 18 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 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执行zip与rar解压缩方法实现代码
2010/12/05 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
python获取图片颜色信息的方法
2015/03/18 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
实习生自荐信范文
2013/11/13 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
工商管理专业自荐信
2014/06/03 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
赢在执行观后感
2015/06/16 职场文书
趣味运动会标语口号
2015/12/26 职场文书
2019学校运动会开幕词
2019/05/13 职场文书