首页 > 解决方案 > Python Multiprocessing:多次执行具有随机性的函数并获得相同的结果

问题描述

在下面的示例代码中,我试图在这个线程中调整接受的答案。目标是使用多处理来生成独立的随机正常数(在下面的示例中,我只想要 3 个随机数)。这是任何更复杂代码的婴儿版本,其中一些随机数生成器用于定义试验函数。

示例代码

import multiprocessing

def trial(procnum, return_dict):
    p = np.random.randn(1)
    num = procnum
    return_dict[procnum] = p, num

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=trial, args=(i,return_dict))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()
    print(return_dict.values())

但是,输出每次都给我相同的随机数,而不是 return_dict 中每个条目的独立随机数。

输出

[(array([-1.08817286]), 0), (array([-1.08817286]), 1), (array([-1.08817286]), 2)]

我觉得这是一个非常愚蠢的错误。有人可以揭露我的愚蠢吗:)

标签: pythonnumpymultiprocessingreturn

解决方案


这不是一个愚蠢的错误,它与numpy跨核心分期的方式有关。在此处阅读更多信息:https ://discuss.pytorch.org/t/why-does-numpy-random-rand-produce-the-same-values-in-different-cores/12005

但解决方案是numpy从一个大范围内给出一个随机种子:

import multiprocessing
import numpy as np
import random

def trial(procnum, return_dict):
    np.random.seed(random.randint(0,100000))
    p = np.random.randn()
    return_dict[procnum] = p

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []
    for i in range(3):
        p = multiprocessing.Process(target=trial, args=(i,return_dict))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()
    print(return_dict.values())

推荐阅读