我在使用 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
如果我删除函数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()