子进程生成相同的"随机"数字作为父进程

时间:2018-04-15 23:33:08

标签: python numpy random multiprocessing

我在使用concurrent.futuresnp.random进行模拟时遇到了一些问题。

示例:

import numpy as np
from concurrent.futures import ProcessPoolExecutor, as_completed
from time import sleep

def calc_g():
    sleep(1)
    u = np.random.uniform()
    print u

futures = {}
with ProcessPoolExecutor() as executor:

    for i in range(0,10):  
        job = executor.submit(calc_g)
        futures[job] = i

    for job in as_completed(futures):
        job.result()

我在此模拟中的结果是:

python teste.py
0.590820857053
0.590820857053
0.590820857053
0.590820857053
0.890384312465
0.890384312465
0.890384312465
0.890384312465
0.391709923204
0.391709923204

如果我删除了sleep函数中的calc_g()函数,结果似乎更随机:

python teste.py
0.116725033305
0.919465043075
0.116725033305
0.116725033305
0.608303685887
0.59397039096
0.608862016487
0.800008484487
0.689917804793
0.116725033305

我认为它与numpy使用的种子的生成有关。 Python从主程序生成分支,同一种子被复制到子进程。由于随机数的生成过程在生成种子后是确定性的,因此来自np.random.uniform()的值是相同的。

有人可以通过示例更好地解释这一点吗?

我应该如何在并行任务中使用np.random来模拟随机投掷硬币?

1 个答案:

答案 0 :(得分:2)

对于多处理中的独立PRNG流,请为每个流程提供自己的RandomState。最简单的修复,改变这一行:

u = np.random.uniform()

对此:

u = np.random.RandomState().uniform()