如何避免Python随机生成的数字重复出现(附示例代码)
避免随机数重复的猜数字代码优化
原代码的问题在于每次调用random.randint(1, 100)会重复生成已经试过的数字,要解决这个问题,同时保持代码灵活性(比如方便调整数字范围),可以用两种实用思路实现:
方案一:用集合记录已尝试的数字
核心逻辑是维护一个集合存储已经猜过的数字,每次生成新随机数时先检查是否在集合内,不在才使用并加入集合,从根源避免重复。这种方式不用提前生成所有数字,内存占用更低,适合数字范围较大的场景。
修改后的代码:
import random import time import sys # 可配置范围参数,提升灵活性,改范围直接调这俩值 MIN_NUM = 1 MAX_NUM = 100 try: z = int(input(f"Put a number between {MIN_NUM} and {MAX_NUM}: ")) except ValueError: sys.exit("Please enter a valid integer") if z < MIN_NUM or z > MAX_NUM: sys.exit(f"Number must be between {MIN_NUM} and {MAX_NUM}") attempted = set() y = random.randint(MIN_NUM, MAX_NUM) attempted.add(y) while y != z: print(f"trying again, number was {y}") time.sleep(0.2) # 循环生成直到拿到未尝试过的数字 while y in attempted: y = random.randint(MIN_NUM, MAX_NUM) attempted.add(y) print(f"Got it! The number was {y}")
补充说明:
- 把数字范围封装成变量
MIN_NUM和MAX_NUM,后续调整范围无需修改多处代码,灵活性拉满 - 新增了输入非整数的异常处理,比原代码更健壮
- 集合的查找操作是O(1)效率,不会因为尝试次数增多变慢
方案二:洗牌生成不重复序列
如果数字范围不大(比如1-100),可以直接生成所有可能的数字列表,洗牌后逐个取用,天然保证每个数字只出现一次,代码结构更简洁直观。
修改后的代码:
import random import time import sys # 可配置范围参数 MIN_NUM = 1 MAX_NUM = 100 try: z = int(input(f"Put a number between {MIN_NUM} and {MAX_NUM}: ")) except ValueError: sys.exit("Please enter a valid integer") if z < MIN_NUM or z > MAX_NUM: sys.exit(f"Number must be between {MIN_NUM} and {MAX_NUM}") # 生成所有候选数字并打乱顺序 number_pool = list(range(MIN_NUM, MAX_NUM + 1)) random.shuffle(number_pool) for y in number_pool: if y == z: print(f"Got it! The number was {y}") break print(f"trying again, number was {y}") time.sleep(0.2)
补充说明:
- 用
range生成连续数字列表,random.shuffle打乱顺序后遍历,完全避免重复 - 同样支持通过变量快速调整数字范围,维护成本低
- 不需要额外的重复检查逻辑,代码更清爽
内容的提问来源于stack exchange,提问作者Brayden Senter
相关产品推荐
相关产品推荐

