Python模拟计算5张扑克牌两对出现概率及代码优化问题
解答
现有代码存在的问题
- 仅完成了1000次手牌抽取的逻辑,没有统计符合「两对」条件的次数,最终仅打印了第1000次的手牌,完全未实现概率计算相关逻辑
- 发牌逻辑功能正确,但写法较为繁琐,可以用更简洁的内置方法实现
核心逻辑说明
两对判定规则
统计手牌中每个牌值的出现次数,将次数按降序排序后,结果恰好为[2,2,1]时符合要求:
- 可自动排除四条(排序后为
[4,1])、葫芦(排序后为[3,2])、三条(排序后为[3,1,1])、单对(排序后为[2,1,1,1])等不符合的情况
更优的发牌实现
可以直接使用random.sample()方法实现无重复抽样,无需手动遍历pop元素,代码更简洁高效。
完整可运行代码
import random from collections import Counter def generatedeck(): # 生成1~13各4张的牌组 return [i for i in range(1,14) for _ in range(4)] def is_two_pairs(hand): # 统计每个牌值出现次数,降序排序 cnt = sorted(Counter(hand).values(), reverse=True) return cnt == [2,2,1] def main(): seed = int(input()) random.seed(seed) valid_count = 0 total = 1000 for _ in range(total): deck = generatedeck() # 直接抽5张不重复的牌 hand = random.sample(deck, 5) if is_two_pairs(hand): valid_count += 1 # 输出保留三位小数,和示例结果对齐 print(round(valid_count / total, 3)) if __name__=='__main__': main()
验证说明
上述代码运行后和题目给出的模拟示例完全匹配:
- 输入0时输出0.055
- 输入11时输出0.047
- 输入42时输出0.046
内容的提问来源于stack exchange,提问作者Glinting Orc
相关产品推荐
相关产品推荐

