热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

斗牛概率计算

日回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛。在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率)。v新:7350

日回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛。在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率)。

v新:7350815



斗牛的玩法是:

  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源代码:

  1. # encoding=utf-8

  2. __author__ = 'kevinlu1010@qq.com'

  3. import os

  4. import cPickle

  5.  
  6. from copy import copy

  7. from collections import Counter

  8. import itertools

  9. '''

  10. 计算斗牛游戏的概率

  11. '''

  12.  
  13. class Poker():

  14. '''

  15. 一张牌

  16. '''

  17.  
  18. def __init__(self, num, type):

  19. self.num = num # 牌数

  20. self.type = type # 花色

  21.  
  22.  
  23. class GamePoker():

  24. '''

  25. 一手牌,即5张Poker

  26. '''

  27. COMMON_NIU = 1 # 普通的牛,即牛一-牛七

  28. NO_NIU = 0 # 没有牛

  29. EIGHT_NINE_NIU = 2 # 牛九或牛八

  30. TEN_NIU = 3 # 牛十

  31. THREE_SAME = 4 # 三条

  32. FOUR_SAME = 5 # 四条

  33.  
  34. def __init__(self, pokers):

  35. assert len(pokers) == 5

  36. self.pokers = pokers

  37. self.num_pokers = [p.num for p in self.pokers]

  38. # self.weight = None # 牌的权重,权重大的牌胜

  39. # self.money_weight = None # 如果该牌赢,赢钱的权重

  40. self.result = self.sumary()

  41.  
  42. def is_niu(self):

  43. '''

  44. 是否有牛

  45. :return:

  46. '''

  47. # if self.is_three_same():

  48. # return 0

  49. for three in itertools.combinations(self.num_pokers, 3):

  50. if sum(three) % 10 == 0:

  51. left = copy(self.num_pokers)

  52. for item in three:

  53. left.remove(item)

  54. point = sum(left) % 10

  55. return 10 if point == 0 else point

  56.  
  57. return 0

  58.  
  59. def is_three_same(self):

  60. '''

  61. 是否3条

  62. :return:

  63. '''

  64. # if self.is_four_same():

  65. # return 0

  66. count = Counter([p.num for p in self.pokers])

  67. for num in count:

  68. if count[num] == 3:

  69. return num

  70. return 0

  71.  
  72. def is_four_same(self):

  73. '''

  74. 是否4条

  75. :return:

  76. '''

  77. count = Counter([p.num for p in self.pokers])

  78. for num in count:

  79. if count[num] == 4:

  80. return num

  81. return 0

  82.  
  83. def sumary(self):

  84. '''

  85. 计算牌

  86. '''

  87. if self.is_four_same():

  88. return GamePoker.FOUR_SAME

  89. if self.is_three_same():

  90. return GamePoker.THREE_SAME

  91. niu_point = self.is_niu()

  92. if niu_point in (8, 9):

  93. return GamePoker.EIGHT_NINE_NIU

  94. elif niu_point == 10:

  95. return GamePoker.TEN_NIU

  96. elif niu_point > 0:

  97. return GamePoker.COMMON_NIU

  98. else:

  99. return GamePoker.NO_NIU

  100.  
  101. def get_all_pokers():

  102. '''

  103. 生成所有的Poker,共四十个

  104. :return:

  105. '''

  106. pokers = []

  107. for i in range(1, 11):

  108. for j in ('A', 'B', 'C', 'D'):

  109. pokers.append(Poker(i, j))

  110.  
  111. return pokers

  112.  
  113.  
  114. def get_all_game_poker(is_new=0):

  115. '''

  116. 生成所有game_poker

  117. :param pokers:

  118. :return:

  119. '''

  120. pokers = get_all_pokers()

  121. game_pokers = []

  122.  
  123. if not is_new and os.path.exists('game_pokers'):

  124. with open('game_pokers', 'r') as f:

  125. return cPickle.loads(f.read())

  126.  
  127. for pokers in itertools.combinations(pokers, 5): # 5代表五张牌

  128. game_pokers.append(GamePoker(pokers))

  129. with open('game_pokers', 'w') as f:

  130. f.write(cPickle.dumps(game_pokers))

  131. return game_pokers

  132.  
  133.  
  134. def print_rate(game_pokers):

  135. total_num = float(len(game_pokers))

  136. four_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.FOUR_SAME])

  137. three_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.THREE_SAME])

  138. ten_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.TEN_NIU])

  139. eight_nine_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.EIGHT_NINE_NIU])

  140. common_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.COMMON_NIU])

  141. no_num = len([game_poker for game_poker in game_pokers if game_poker.result == GamePoker.NO_NIU])

  142. print '所有牌的组合数:%d' % total_num

  143. print '出现四条的组合数:%d,概率 :%.2f%%' % (four_num, four_num * 100 / total_num)

  144. print '出现三条的组合数:%d,概率 :%.2f%%' % (three_num, three_num * 100 / total_num)

  145. print '出现牛十的组合数:%d,概率 :%.2f%%' % (ten_num, ten_num * 100 / total_num)

  146. print '出现牛九或牛八的组合数:%d,概率 :%.2f%%' % (eight_nine_num, eight_nine_num * 100 / total_num)

  147. print '出现牛一到牛七的组合数:%d,概率 :%.2f%%' % (common_num, common_num * 100 / total_num)

  148. print '出现没有牛的组合数:%d,概率 :%.2f%%' % (no_num, no_num * 100 / total_num)

  149.  
  150.  
  151. def main():

  152. game_pokers = get_all_game_poker() # 658008种

  153. print_rate(game_pokers)

  154.  
  155.  
  156. main()


最后上一个简陋的界面  

三张手牌

 


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
author-avatar
mobiledu2502883211
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有