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

如何避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:05:22