使用random.randint生成不重复随机数时返回None的问题排查
解决1-90无重复随机数生成问题
原代码问题分析
你的代码出现返回None和重复数的核心原因:
- 递归无返回值:当生成的数字已存在时,递归调用
generate_random_number()但未返回该调用的结果,导致函数默认返回None。 - 冗余逻辑:
elif num in used_numbers and num == generate_random_number()完全多余,既没必要判断新生成的数是否和当前数相等,也会干扰正常的递归流程。 - 效率问题:用列表判断
num in used_numbers是O(n)复杂度,后期剩余数字越少,重复概率越高,性能越差。
推荐实现:洗牌法(高效简洁)
直接生成1-90的序列并打乱,是最高效的无重复随机数生成方式,避免了反复重试的问题:
import random # 生成1到90的完整序列 numbers = list(range(1, 91)) # 随机打乱序列 random.shuffle(numbers) # 遍历输出每个数 for num in numbers: print(num)
修复原思路的实现
如果坚持用“生成-判断”的逻辑,需修正递归返回逻辑并改用集合优化效率:
import random used_numbers = set() def generate_random_number(): num = random.randint(1, 90) if num not in used_numbers: used_numbers.add(num) return num # 数字已存在时,递归调用并返回结果 return generate_random_number() for i in range(90): print(generate_random_number())
修复说明
- 改用
set存储已用数字,判断存在性的复杂度降为O(1),大幅提升后期性能。 - 递归调用时直接返回结果,确保函数始终返回有效数字,避免
None。 - 移除冗余的
elif分支,逻辑更清晰。
内容的提问来源于stack exchange,提问作者EitanBiletski
相关产品推荐
相关产品推荐

