2) 这些图的生成没有任何随机方面,因此据我所知,接受种子没有任何意义。
1) 更棘手。似乎networkx 使用random 和numpy.random 库的组合来生成随机数。图形生成器,例如watts_strogatz_graph 使用前者,而 layout 使用后者。
简短回答:只需为两个库设置种子:
import random
import numpy as np
seed = 123
random.seed(seed)
np.random.seed(seed)
解释发生了什么
无论如何,这里有一个简单的例子,表明种子被考虑到像watts-strogatz 生成器这样的图(但你必须有p>0 否则没有重新布线,因此没有随机组件!)。
G2 和 G3 的边缘不同,因为它们使用了不同的种子,但 G1 和 G2 是相同的。
import networkx as nx
seed = 123
G1 = nx.watts_strogatz_graph(30, 3, 0.1, seed=seed)
G2 = nx.watts_strogatz_graph(30, 3, 0.1, seed=seed)
G3 = nx.watts_strogatz_graph(30, 3, 0.1, seed=seed+1)
G1.edge == G2.edge
>>> True
G3.edge == G2.edge
>>> False
为确保每次布局都相同,您可以调用np.random.seed(myseed)。这与使用 np.random.RandomState 不同,后者正在创建随机数流的新实例,并且不会被 nx 布局函数使用。 (尽管在您自己的随机流中它是good practice to use an independent stream)。
import numpy as np
np.random.seed(seed)
pos1 = nx.spring_layout(G1, scale=len(G.nodes()))
pos1b = nx.spring_layout(G1, scale=len(G.nodes()))
# should differ! same graph, but the rng has been called
np.random.seed(seed) #reset seed
pos2 = nx.spring_layout(G2, scale=len(G.nodes()))
# should be same as p1! G1==G2 (from above), and seed for layout
# is the same.
diffs = 0
for node in pos1:
if np.all(pos1[node] != pos1b[node]):
diffs += 1
print diffs
>>> 30
diffs2 = 0
for node in pos1:
if np.all(pos1[node] != pos2[node]):
diffs2 += 1
print diffs2
>>> 0
这个问题/答案Differences between numpy.random and random.random in Python 有两个随机库的一些描述。