gpt4 book ai didi

Python 多处理 : executing a function with randomness multiple times and getting identical results

转载 作者:行者123 更新时间:2023-12-02 02:40:45 27 4
gpt4 key购买 nike

在下面的示例代码中,我试图调整 this thread 中接受的答案。 。目标是使用多重处理来生成独立的随机正态数(在下面的示例中我只想要 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)]

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

最佳答案

这不是一个愚蠢的错误,它与 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())

关于Python 多处理 : executing a function with randomness multiple times and getting identical results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63675826/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com