我正在研究Python的多处理模块。我有两个案例:
例如。1
def Foo(nbr_iter):
for step in xrange(int(nbr_iter)) :
print random.uniform(0,1)
...
from multiprocessing import Pool
if __name__ == "__main__":
...
pool = Pool(processes=nmr_parallel_block)
pool.map(Foo, nbr_trial_per_process)示例2. (使用numpy)
def Foo_np(nbr_iter):
np.random.seed()
print np.random.uniform(0,1,nbr_iter)在这两种情况下,随机数生成器都是在其派生进程中播种的。
为什么我必须在numpy示例中显式地进行种子设定,而不是在Python示例中呢?
发布于 2019-07-28 15:38:04
刚刚引入了引用"..three策略的实现,可用于跨多个进程生成可重复的伪随机数(本地或分布式)..“
第一种策略是使用SeedSequence对象。有许多父/子选项,但对于我们的例子,如果您希望生成相同的随机数,但每次运行时不同,则使用
(python3,打印来自4个进程的3个随机数)
from numpy.random import SeedSequence, default_rng
from multiprocessing import Pool
def rng_mp(rng):
return [ rng.random() for i in range(3) ]
seed_sequence = SeedSequence()
n_proc = 4
pool = Pool(processes=n_proc)
pool.map(rng_mp, [ default_rng(seed_sequence) for i in range(n_proc) ])
# 2 different runs
[[0.2825724770857644, 0.6465318335272593, 0.4620869345284885],
[0.2825724770857644, 0.6465318335272593, 0.4620869345284885],
[0.2825724770857644, 0.6465318335272593, 0.4620869345284885],
[0.2825724770857644, 0.6465318335272593, 0.4620869345284885]]
[[0.04503760429109904, 0.2137916986051025, 0.8947678672387492],
[0.04503760429109904, 0.2137916986051025, 0.8947678672387492],
[0.04503760429109904, 0.2137916986051025, 0.8947678672387492],
[0.04503760429109904, 0.2137916986051025, 0.8947678672387492]]如果您希望在重现时获得相同的结果,只需使用相同的种子(17)重新播种即可:
import numpy as np
from multiprocessing import Pool
def rng_mp(seed):
np.random.seed(seed)
return [ np.random.rand() for i in range(3) ]
n_proc = 4
pool = Pool(processes=n_proc)
pool.map(rng_mp, [17] * n_proc)
# same results each run:
[[0.2946650026871097, 0.5305867556052941, 0.19152078694749486],
[0.2946650026871097, 0.5305867556052941, 0.19152078694749486],
[0.2946650026871097, 0.5305867556052941, 0.19152078694749486],
[0.2946650026871097, 0.5305867556052941, 0.19152078694749486]]https://stackoverflow.com/questions/29854398
复制相似问题