如何用Python生成指定数量的唯一随机图弧对?
生成无重复有向弧的几种可行方法
针对你的需求,np.random.randint本身是独立随机抽样,没办法直接避免重复弧,这里提供两种实用的解决思路:
方法一:全量生成后随机抽样(适合需求弧数接近总可能弧数的场景)
先生成所有符合要求的有向弧,再随机打乱后取前na条,从根源避免重复:
import numpy as np nv = 3 na = 5 # 生成所有不含自环的有向弧(若允许自环,移除if i != j即可) all_valid_arcs = np.array([(i, j) for i in range(nv) for j in range(nv) if i != j]) # 随机打乱顺序 np.random.shuffle(all_valid_arcs) # 选取前na条唯一弧 unique_arcs = all_valid_arcs[:na] print(unique_arcs)
方法二:集合去重+循环生成(适合需求弧数远小于总可能弧数的场景)
用集合存储已生成的弧(集合天然去重),循环生成直到凑够na条,内存占用更低:
import numpy as np nv = 3 na = 5 generated_arcs = set() while len(generated_arcs) < na: # 生成单条弧,转成元组才能存入集合 new_arc = tuple(np.random.randint(nv, size=2)) # 若允许自环,移除下面的判断 if new_arc[0] != new_arc[1]: generated_arcs.add(new_arc) # 转成numpy数组格式 unique_arcs = np.array(list(generated_arcs)) print(unique_arcs)
补充说明
- 若你的场景允许自环(即弧的起点和终点相同,比如[2,2]),只需移除两段代码中的
if i != j/if new_arc[0] != new_arc[1]判断即可。 - 两种方法的选择:当
na接近总可能弧数(比如nv=100,na=9000)时,用方法一效率更高;当na远小于总弧数(比如nv=100,na=10)时,方法二更省内存。
内容的提问来源于stack exchange,提问作者TK99
相关产品推荐
相关产品推荐

