为什么python多处理总是生成相同的随机值



我正在使用pool.map来处理我的函数。函数中添加了一个随机值。但我发现每个过程的结果都是一样的。如何为每个进程生成不同的随机值。这是一个例子:

import numpy as np
from numpy.random import randn
def testfun(X):
scipy.random.seed
y = randn()
return y
from multiprocessing import Pool

pool = mp.Pool(processes = 8)
result = pool.map(testfun,np.arange(8))

我想要8个不同的值。

您需要为多处理池中的每个进程(而不是对rand的每个调用(为随机数生成器种子一次,方法是使用池初始化器,即在multiprocessing.Pool构造函数上指定初始化器参数。在执行任何任务之前,您指定的此函数将为池中的每个进程调用一次,可用于执行任何一次性初始化,例如设置全局变量,或者在这种情况下为该进程设定随机数生成器的种子。

import numpy as np
from numpy.random import randn, seed

def init_pool_processes():
seed()
def testfun(X):
y = randn()
return y
# Required by Windows:
if __name__ == '__main__':
from multiprocessing import Pool
pool = Pool(processes=8, initializer=init_pool_processes)
result = pool.map(testfun, np.arange(8))
print(result)

打印:

[-0.01738709180801345, -0.6941424935875462, 0.41955492420787543, -0.890711442154167, -0.6894630549510319, 1.1549486347982545, -0.27329303494286733, 0.16447656347746123]

scipy.random.seed仅引用函数。实际上,你需要用scipy.random.seed()来称呼它。

您需要提供不同的种子值。你从范围中得到的值X就可以了。我无法执行你的代码,但我创建了一个简化版本:

from multiprocessing import Pool
import random

def testfun(seed_: int):
random.seed(seed_)
y = random.gauss(0, 1)
return y

if __name__ == "__main__":
pool = Pool(8)
result = pool.map(testfun, range(8))
print(result)

最好将pool放入with上下文管理器中。

相关内容

  • 没有找到相关文章

最新更新