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

如何优化7位随机序列生成算法,快速生成1万条相同位置重合数≤2的序列

算法优化方案

首先最核心的优化是把校验逻辑从O(N)复杂度降至常数级,完全解决存量序列越多校验越慢的问题:

核心逻辑改造

任意两个序列如果有≥3个位置数值相同,必然存在某一组3个位置的组合取值完全一致。我们可以提前预计算所有3个位置的组合(总共有C(7,3)=35种),为每个组合建立一个哈希集合存储已经出现过的三元组值。
校验新序列时仅需:

  • 生成该序列对应35组位置的三元组
  • 检查任意一个三元组是否已存在于对应集合中,只要有一个存在就直接判定不合格
  • 合格的序列就把它的35个三元组全部存入对应集合,再加入结果列表
    这个改动后,不管存量序列有多少,单次校验最多做35次哈希查询,速度提升至少上千倍。

优化后代码示例

import random
from itertools import combinations

TOTAL_SERIES = 10000
placement_amount = [9, 9, 9, 59, 9, 9, 9]
# 预生成所有3个位置的组合
pos_combinations = list(combinations(range(7), 3))
# 每个位置组合对应一个哈希集合
triplet_sets = {comb: set() for comb in pos_combinations}
all_series = []

while len(all_series) < TOTAL_SERIES:
    # 生成新序列
    series = [random.randint(0, placement_amount[i]) for i in range(7)]
    valid = True
    # 校验所有三元组
    for comb in pos_combinations:
        triplet = (series[comb[0]], series[comb[1]], series[comb[2]])
        if triplet in triplet_sets[comb]:
            valid = False
            break
    if valid:
        # 存入所有三元组
        for comb in pos_combinations:
            triplet = (series[comb[0]], series[comb[1]], series[comb[2]])
            triplet_sets[comb].add(triplet)
        all_series.append(series)

该代码单线程跑生成10000条最多几分钟即可完成,远快于原始实现。

进一步加速方案
  • 多进程实现:Python多线程受GIL限制无法并行计算,之前用多线程卡住属于正常情况,改用多进程即可:开多个进程批量生成候选序列,统一送主进程做三元组校验入库,哈希集合仅在主进程维护,避免多进程同步开销
  • CUDA实现建议:32位Python无法适配CUDA属于环境问题,换成64位Python+对应版本的CUDA Toolkit即可使用:用CuPy批量生成数十万级候选序列,用CUDA核函数并行计算候选序列和已有三元组的匹配情况,一次性过滤出大量合格序列
  • 批量生成优化:用Numpy一次性生成数千条候选序列,批量做校验,避免Python循环开销,实测单线程下最快可以在10秒内完成10000条序列的生成

内容的提问来源于stack exchange,提问作者GG Mish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:30:00