You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python皇家同花顺生成算法异常:结果不一致求技术排查

问题分析与修复方案

核心问题总结

你的代码最大的问题是完全没有实现皇家同花顺的次数统计逻辑——每次调用check_royal()返回的1没有被累加记录,运行结束后看不到任何统计结果,这才导致你觉得“结果不一致”。除此之外,代码还有几个可优化的点:


具体问题点

  1. 缺失统计累加:主函数仅调用check_royal(),但未捕获其返回值进行计数,运行后无任何统计输出。
  2. 低效的手牌生成:hand_gen()用循环随机选牌再判断去重,效率较低,不如直接生成完整牌库后洗牌取牌。
  3. 冗余与重复计算:check_royal()每次调用都重新生成皇家同花顺列表,造成不必要的重复计算;else: pass属于无效代码。
  4. 不规范的循环写法: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} 次皇家同花顺")

修复说明

  1. 添加统计计数器:新增royal_count变量,每次检测到皇家同花顺时累加计数,最终输出统计结果。
  2. 优化手牌生成逻辑:直接生成完整52张牌的牌库,洗牌后取前5张,既高效又避免了重复牌的判断。
  3. 预生成皇家同花顺集合:在主函数中提前生成所有可能的皇家同花顺集合,避免每次调用check_royal()都重复生成,提升性能。
  4. 简化函数逻辑:删除冗余代码,用更简洁的列表推导式实现皇家同花顺集合的生成,代码可读性更强。

内容的提问来源于stack exchange,提问作者JJ Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:26:04