如何生成指定范围内不重复随机数并赋值给不同对象的对应变量
不重复随机数分配修复方案
核心逻辑是避免单次随机生成后不做校验直接分配,推荐两种成熟实现方案,按需选择即可:
方案1:洗牌法(推荐,分配数量接近范围大小时效率更高)
实现思路是先生成指定范围的所有整数,打乱顺序后直接取数,天然无重复:
- 先构造指定范围
[min, max]的全量整数池,总元素数为max - min + 1 - 对整数池执行随机洗牌打乱顺序
- 按需要分配的对象数量,从打乱后的池子里依次取前N个值分配即可
示例代码(Python):
import random min_val = 1 max_val = 100 assign_count = 20 # 待分配的对象总数,不得大于范围总元素数 # 生成全量整数池 num_pool = list(range(min_val, max_val + 1)) # 随机洗牌 random.shuffle(num_pool) # 取对应数量的不重复随机数 unique_randoms = num_pool[:assign_count]
注意:分配的对象数量不能超过你指定范围的总元素数,否则不可能实现全不重复的要求
方案2:集合校验法(适合分配数量远小于范围大小的场景)
实现思路是用集合存已经生成的随机数,重复就重新生成:
- 初始化空集合存储已生成的随机数
- 每次生成新随机数后判断是否在集合中:不存在则存入集合,存在则重新生成
- 直到集合大小等于需要分配的对象数量,即可取出分配
示例代码(Python):
import random min_val = 1 max_val = 100 assign_count = 20 unique_randoms = set() while len(unique_randoms) < assign_count: current_num = random.randint(min_val, max_val) unique_randoms.add(current_num) # 转列表后按顺序分配 unique_randoms = list(unique_randoms)
选型参考
- 当分配数量占范围总元素数的比例超过20%时,优先用洗牌法,避免重复生成多次导致效率下降
- 当分配数量占比极低时,用集合校验法内存占用更低
内容的提问来源于stack exchange,提问作者Shatadal Das
相关产品推荐
相关产品推荐

