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中的文件I/O操作
May 24 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
Python建立Map写Excel表实例解析
Jan 17 Python
python将list转为matrix的方法
Dec 12 Python
Python实现的各种常见分布算法示例
Dec 13 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
Python获取时间戳代码实例
Sep 24 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
python 利用PyAutoGUI快速构建自动化操作脚本
May 31 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
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
小程序实现多选框功能
2018/10/30 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python新手经常遇到的17个错误分析
2014/07/30 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
对Python中的@classmethod用法详解
2018/04/21 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
python ssh 执行shell命令的示例
2020/09/29 Python
个人应聘自我评价分享
2013/11/18 职场文书
大学自我鉴定范文
2013/12/26 职场文书
西双版纳导游词
2015/02/03 职场文书
检察院起诉书
2015/05/20 职场文书
肖申克救赎观后感
2015/06/02 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
初中语文教学随笔
2015/08/15 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
PyTorch中permute的使用方法
2022/04/26 Python