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

如何用yield生成器+random.randint生成6个0-40不重复随机数?

原代码问题梳理

原代码存在几个致命问题,导致完全无法实现需求:

  • 未定义random_number变量,直接调用会触发NameError
  • yield执行后,后续代码要等生成器再次被迭代才会运行,导致重复检查逻辑根本不会生效
  • unacceptable_values2未初始化,直接append会报错
  • 就算修复变量问题,for i in range(6)的固定循环加continue,会导致遇到重复时跳过当前迭代,最终生成的数字不足6个
正确实现方案

下面提供两种简洁易懂的写法,都能实现「生成6个0-40范围内不重复随机数,重复则丢弃重生成」的需求,适合新手理解:

写法一:手动控制去重逻辑(贴合需求描述)

import random

def lottery():
    used_numbers = []  # 存已经生成过的数字,避免重复
    while len(used_numbers) < 6:  # 凑够6个不重复数字就停止
        num = random.randint(0, 40)
        if num not in used_numbers:
            used_numbers.append(num)
            yield num

逻辑解释

  1. 先建一个空列表used_numbers,用来记录已经生成过的数字
  2. 用while循环控制总数,只要列表里的数字少于6个,就继续生成
  3. 每次生成一个随机数后,先检查有没有在已用列表里:
    • 没出现过就把它加入列表,同时yield出去
    • 出现过就跳过,重新生成下一个数

写法二:用random.sample简化代码(更省心)

如果只是需要6个不重复的随机数,random模块自带的sample方法可以直接帮我们完成去重,代码更简洁:

import random

def lottery():
    # 从0到40的整数里随机选6个不重复的,逐个yield出去
    for num in random.sample(range(0, 41), 6):
        yield num

逻辑解释

  • range(0,41)会生成0到40的所有整数(左闭右开,所以41才能包含40)
  • random.sample(序列, 数量)会从序列里随机挑选指定数量的不重复元素
  • 最后用for循环把这些元素逐个yield,完全符合生成器的要求
测试代码

可以用下面的代码验证生成器是否正常工作:

for num in lottery():
    print(num)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:07:27