Python实现不重复随机数选取程序时随机返回None问题求助
问题解答
问题根源排查
你遇到的返回None问题是因为递归调用时没有返回结果:当生成的随机数和上一次的lastChoice相等时,你调用了递归函数但没有把该调用的返回值向外传递,当前层级函数没有显式返回值,Python默认返回None。
另外原实现使用全局变量存储上次选择的值,复用性差,多个场景调用会互相干扰,也不便于调试。
基础修复版(保持相邻不重复逻辑)
先修复原有逻辑的bug,同时去掉全局变量,用参数传递上次的选择值,用循环替代递归避免栈溢出风险:
import random def choose_new_number(min_num: int, max_num: int, last_choice: int) -> int: while True: current = random.randint(min_num, max_num) if current != last_choice: return current if __name__ == "__main__": last_num = 0 # 生成49个1~10的随机数,相邻不会重复 for _ in range(49): last_num = choose_new_number(1, 10, last_num) print(last_num)
更优实现(范围内无重复循环抽取)
如果你的需求是抽完范围内所有数之前完全不重复,注意1~10仅存在10个不重复值,无法生成50个完全不重复的结果,这种场景推荐用洗牌算法实现循环无重复抽取,效率远高于逐次随机判断:
import random from typing import List def generate_cycle_unique_nums(min_num: int, max_num: int, total_count: int) -> List[int]: num_pool = list(range(min_num, max_num + 1)) result = [] while len(result) < total_count: random.shuffle(num_pool) # 最后一次取数避免超出需要的总数 take_count = min(len(num_pool), total_count - len(result)) result.extend(num_pool[:take_count]) return result if __name__ == "__main__": # 生成50个1~10的随机数,每10个以内完全无重复 for num in generate_cycle_unique_nums(1, 10, 50): print(num)
内容的提问来源于stack exchange,提问作者Ben Cantos-Hodge
相关产品推荐
相关产品推荐

