5张扑克牌同花概率模拟Python代码运行结果异常排查
代码逻辑问题
- 最核心的错误是花色计数变量没有在每次模拟前重置:
hearts、spades、diamonds、clubs四个计数变量的初始化放在了模拟循环的最外层,每次模拟完一手牌后,四个变量的计数不会清零,会一直累计到后续的模拟中。比如第一次模拟的手牌有2张红桃、1张黑桃、1张方块、1张梅花,四个变量的值分别为2、1、1、1,第二次模拟再叠加新的5张牌的花色计数,总和会变成10,永远不可能出现某一个花色计数等于5的情况,最终统计到的同花次数会远低于真实值。 - 次要问题:循环变量
i重复定义,外层模拟循环、取手牌循环、判断花色循环都用了同一个变量名i,虽然Python语法允许,但可读性差,容易引发潜在逻辑错误。 - 额外说明:你提到的理论值0.03是错误的,5张牌随机抽中同花(含同花顺)的真实概率约为0.00198(即0.198%),排除同花顺后约为0.00196,远低于3%。
修正后的代码
from random import * # 生成牌组 deck = [] for suit in range(4): for value in range(13): deck.append(100 * suit + value) sim = 100000 flush = 0 for _ in range(sim): # 每次模拟前重置花色计数 hearts = 0 spades = 0 diamonds = 0 clubs = 0 # 生成手牌 shuffle(deck) hand = deck[:5] # 判断同花 for card in hand: if card < 100: hearts += 1 elif card < 200: spades += 1 elif card < 300: diamonds += 1 else: clubs += 1 if hearts == 5 or spades == 5 or diamonds == 5 or clubs == 5: flush += 1 # 输出概率 print(flush / sim)
运行修正后的代码,得到的结果会在0.002左右浮动,和真实理论值一致。
内容的提问来源于stack exchange,提问作者The anime kid
相关产品推荐
相关产品推荐

