如何用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
逻辑解释
- 先建一个空列表
used_numbers,用来记录已经生成过的数字 - 用
while循环控制总数,只要列表里的数字少于6个,就继续生成 - 每次生成一个随机数后,先检查有没有在已用列表里:
- 没出现过就把它加入列表,同时
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
相关产品推荐
相关产品推荐

