作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的示例代码中,我试图调整 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/
我是一名优秀的程序员,十分优秀!