Pyexcel项目中random.choice()运行不符合预期,如何随机选取符合要求的2号角色
问题根因
你的递归函数在触发重抽的if/elif分支中,调用递归后没有返回递归调用的结果,导致只要第一次抽取的元素不符合要求,递归得到的正确结果无法传递回最外层的函数调用,最终返回空值,看起来就像程序终止。你观察到的“元素被固定”是错觉,递归逻辑里实际已经重新抽取了新元素,只是没有把结果返回而已。
修复方案
1. 适配现有递归写法
只需在两个递归调用的位置加上return,把递归结果传递出去即可:
def another_one(sequence): item = random.choice(sequence) if item[0] == fighter_one: return another_one(sequence) elif item[1] < 20: return another_one(sequence) else: return item
注意:如果符合要求的角色数量极少,递归写法可能存在栈深度溢出的风险,更推荐使用循环实现。
2. 改用循环实现(更稳定)
逻辑更直观,无递归深度风险:
def another_one(sequence): while True: item = random.choice(sequence) if item[0] != fighter_one and item[1] >= 20: return item
3. 预筛选候选池(效率最高)
如果角色数量较多,反复随机抽取的性能损耗较大,可以先筛选出所有符合要求的候选,再一次性随机抽取,还能提前判断是否存在可用角色避免死循环:
# 提前筛选所有符合条件的角色:不是1号选手、pecking值不低于20 candidates = [item for item in sequence if item[0] != fighter_one and item[1] >= 20] # 直接从候选池随机抽取 fighter_two = random.choice(candidates)
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

