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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:24:03