随机种子在提供时不起作用,某些函数不接受种子参数

Random seed doesn't work when provided and some functions don't accept the seed parameter

我想模拟并重现我的结果。因此,我发现使用随机种子数重新生成相同的图很有用。

但是在这种情况下我得到了不同的结果:

seed=1725
my_random = np.random.RandomState(seed)
G = nx.watts_strogatz_graph(30, 3, 0,seed=my_random )
node_positions = nx.spring_layout(G, scale=len(G.nodes()))

l 运行 这行两次。结果我得到了两个不同的图拓扑,不同的邻接矩阵和节点位置。 1) 我怎样才能让它发挥作用?

其次:

下图类不接受种子参数

G=nx.wheel_graph(n)
G=nx.complete_graph(n)
G = nx.balanced_tree(n,tree_depth)
G= nx.star_graph(n) 

2) 如何使这些图 类 考虑种子参数

谢谢

2) 这些图的生成没有任何随机方面,因此据我所知接受种子没有任何意义。

1) 比较棘手。似乎 networkx 使用 randomnumpy.random 库的组合来生成随机数。图形生成器,例如watts_strogatz_graph使用前者,layout使用后者。

简短回答:只需为两个库设置种子:

import random
import numpy as np
seed = 123
random.seed(seed)
np.random.seed(seed)

对发生的事情的解释

无论如何,这是一个简单的例子,显示像 watts-strogatz 生成器这样的图考虑了种子(但你必须有 p>0 否则没有 re-wiring 和因此没有随机成分!)。 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

这个question/answerDifferences between numpy.random and random.random in Python对两个随机库有一些描述。