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

使用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())

修复说明

  1. 改用set存储已用数字,判断存在性的复杂度降为O(1),大幅提升后期性能。
  2. 递归调用时直接返回结果,确保函数始终返回有效数字,避免None。
  3. 移除冗余的elif分支,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:15:15