【发布时间】:2015-07-03 11:10:38
【问题描述】:
我正在研究 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)
Ex 2.(使用 numpy)
def Foo_np(nbr_iter):
np.random.seed()
print np.random.uniform(0,1,nbr_iter)
在这两种情况下,随机数生成器都在它们的分叉进程中播种。
为什么我必须在 numpy 示例中显式地进行播种,而在 Python 示例中却不需要?
【问题讨论】:
-
请解释是什么让你认为你必须
-
因为如果我不这样做,那么每个分叉的进程都会生成相同的随机数序列(仅在 Ex.2 中)
-
无论导致不同行为的原因是什么 - 快速查看源代码并非易事 - numpy 的行为并不出人意料。可重复性是 PRNG 的一个重要特性,并且由于在导入 numpy 时 PRNG 已经播种,因此多处理的 fork() 不应再次播种。
-
查看类似但不重复问题的出色答案:stackoverflow.com/a/5837352/2379433
-
@overcomer - numpy 1.17 只是introduced 新选项(我在下面添加了一个答案),用于“实现的策略,可用于跨多个生成可重复的伪随机数进程”
标签: python numpy random multiprocessing