我在使用concurrent.futures
和np.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
来模拟随机投掷硬币?
答案 0 :(得分:2)
对于多处理中的独立PRNG流,请为每个流程提供自己的RandomState
。最简单的修复,改变这一行:
u = np.random.uniform()
对此:
u = np.random.RandomState().uniform()