Python皇家同花顺生成算法异常:结果不一致求技术排查
问题分析与修复方案
核心问题总结
你的代码最大的问题是完全没有实现皇家同花顺的次数统计逻辑——每次调用check_royal()返回的1没有被累加记录,运行结束后看不到任何统计结果,这才导致你觉得“结果不一致”。除此之外,代码还有几个可优化的点:
具体问题点
- 缺失统计累加:主函数仅调用
check_royal(),但未捕获其返回值进行计数,运行后无任何统计输出。 - 低效的手牌生成:
hand_gen()用循环随机选牌再判断去重,效率较低,不如直接生成完整牌库后洗牌取牌。 - 冗余与重复计算:
check_royal()每次调用都重新生成皇家同花顺列表,造成不必要的重复计算;else: pass属于无效代码。 - 不规范的循环写法:
while iterations != 0的写法不如for循环直观简洁。
修复后的代码
import random # 定义牌面和花色 ranks = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] suits = ["c", "d", "s", "h"] # 优化手牌生成:先创建完整牌库,洗牌后取前5张 def hand_gen(): deck = [rank + suit for rank in ranks for suit in suits] random.shuffle(deck) return deck[:5] # 预定义所有皇家同花顺的集合 def get_royal_flushes(): royal_ranks = ["10", "J", "Q", "K", "A"] return [set(rank + suit for rank in royal_ranks) for suit in suits] def check_royal(royal_flushes): hand = hand_gen() hand_set = set(hand) for rf in royal_flushes: if hand_set == rf: print(f"{hand} 是皇家同花顺,匹配 {rf}") return 1 return 0 if __name__ == "__main__": iterations = 2000000 royal_count = 0 # 提前生成皇家同花顺集合,避免重复计算 royal_flushes = get_royal_flushes() # 用for循环替代while,逻辑更清晰 for _ in range(iterations): royal_count += check_royal(royal_flushes) print(f"迭代 {iterations} 次后,共生成 {royal_count} 次皇家同花顺")
修复说明
- 添加统计计数器:新增
royal_count变量,每次检测到皇家同花顺时累加计数,最终输出统计结果。 - 优化手牌生成逻辑:直接生成完整52张牌的牌库,洗牌后取前5张,既高效又避免了重复牌的判断。
- 预生成皇家同花顺集合:在主函数中提前生成所有可能的皇家同花顺集合,避免每次调用
check_royal()都重复生成,提升性能。 - 简化函数逻辑:删除冗余代码,用更简洁的列表推导式实现皇家同花顺集合的生成,代码可读性更强。
内容的提问来源于stack exchange,提问作者JJ Smith
相关产品推荐
相关产品推荐

