python - 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)]
我觉得这是一个非常愚蠢的错误。有人可以揭露我的愚蠢吗:)
解决方案
这不是一个愚蠢的错误,它与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())
推荐阅读
- mysql - 如何按唯一用户 ID 分组并按最新消息 ID 排序?
- c# - 创建一种方法,将 4 个家庭成员的年龄增加 1
- json - 安装 Perl 模块时出现“致命错误:找不到‘EXTERN.h’文件”
- javascript - 发送 javascript 作为响应
- javascript - 使用不带组件的 vue js
- c - gdb 在尝试运行缓冲区溢出漏洞时卡住了
- django-models - Django-models 无法导入 Modelform
- java - Facebook 按钮登录但未执行登录后应执行的功能
- escaping - 使用 trans 翻译单引号
- amazon-web-services - 何时以及如何对具有分区键和排序键的 Dynamodb GSI 进行分区?