抽5张牌获得three of a kind(三条)的概率计算及代码问题排查
你的代码存在以下核心问题
- 未在循环内初始化
three1/three2/three3变量,不仅会触发变量未定义报错,跨循环累计的计数也会导致判断完全失真 - 计数逻辑错误:
any(hand[0][0] == x[0] for x in hand)的判断永远为真(元素会和自身比较),且单次匹配就加1的逻辑完全无法统计同面值的牌数 - 未排除四条、葫芦(三条+一对)的情况,会导致计算出的概率高于三条的真实概率
- 冗余操作:
shuffle(deck)后再用sample抽牌完全多余,sample本身就会随机抽取不重复的元素,不需要提前洗牌
修改后的完整代码
from random import sample from itertools import product from collections import Counter # 生成牌库 suits = ["s","d","h","c"] values = ["1","2","3","4","5","6","7","8","9","10","11","12","13"] deck = list(product(values, suits)) sim = 100000 three_of_a_kind = 0 for i in range(sim): # 随机抽取5张手牌 hand = sample(deck, 5) # 统计每个面值出现的次数,按降序排序 value_counts = sorted(Counter(card[0] for card in hand).values(), reverse=True) # 判定三条标准:恰好一个面值出现3次,剩余两个面值各出现1次,排除葫芦、四条的情况 if value_counts == [3, 1, 1]: three_of_a_kind += 1 prob_three = three_of_a_kind / sim print(prob_three)
逻辑说明
- 用
collections.Counter统计手牌面值的出现次数,避免手动计数的逻辑错误 - 10万次模拟得到的概率约为2.1%,和官方公布的德州扑克三条出现概率(约2.11%)吻合,结果准确
内容的提问来源于stack exchange,提问作者The anime kid
相关产品推荐
相关产品推荐

