子进程生成与父进程相同的"random"编号



我在使用 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

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

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来模拟抛硬币的随机性?

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

u = np.random.uniform()

对此:

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

相关内容

  • 没有找到相关文章

最新更新