Python 3.x 导致非随机数的多线程池

Python 3.x 导致非随机数的多线程池,python-3.x,multithreading,Python 3.x,Multithreading,我之前问过如何并行运行函数。我想要运行的函数有一个随机元素,其中随机整数被画出来 当我在回答中使用代码时,它会在一个进程内返回重复的数字(如果我添加一个外部循环来重复该进程,则在两次运行之间也会返回重复的数字)。比如说, import numpy as np from multiprocessing.pool import Pool def f(_): x = np.random.uniform() return x*x if __name__ == "__main_

我之前问过如何并行运行函数。我想要运行的函数有一个随机元素,其中随机整数被画出来

当我在回答中使用代码时,它会在一个进程内返回重复的数字(如果我添加一个外部循环来重复该进程,则在两次运行之间也会返回重复的数字)。比如说,

import numpy as np
from multiprocessing.pool import Pool

def f(_):
    x = np.random.uniform()
    return x*x    

if __name__ == "__main__":
    processes = 3
    p = Pool(processes)
    print(p.map(f, range(6)))
返回

[0.8484870744666029, 0.8484870744666029, 0.04019012715175054, 0.04019012715175054, 0.7741414835156634, 0.7741414835156634]
再跑一次可能会失败

[0.17390735240615365, 0.17390735240615365, 0.5188673758527017, 1.308159884267618e-08, 0.09140498447418667, 0.021537291489524404]
似乎有一些内部种子正在使用——我如何生成类似于从
np.random.uniform(size=6)
返回的随机数?

表示需要将种子包含在函数中。提供一种将多个参数传递给
池的方法,一个用于重复,一个用于种子列表。这允许每个过程有一个新的种子,并且是可复制的

import numpy as np
from multiprocessing.pool import Pool

def f(reps, seed):
    np.random.seed(seed)
    x = np.random.uniform()
    return x*x    

#np.random.seed(1)
if __name__ == "__main__":
    processes = 3
    p = Pool(processes)
    print(p.starmap(f, zip(range(6), range(6)))) 

其中第二个参数是种子向量(参见将行更改为
print(p.starmap(f,zip(范围(0,6),np.repeat(1,6)))

@ranfisch;是的,我希望它是可复制的,但现在的主要问题是不能在各个过程中得到相同的随机数。如果我没有理解错误,我很抱歉,但是你可以使用np.random.seed(0)在所有过程中都有相同的种子,或者我理解错误?@ranifisch;从实例出发;我希望有六个不同的数字,类似于
np.random.uniform(size=6)
(注意,我只是指6个不同的数字,而不是它们必须等于给定种子的
np.ranomd.unifirm
的结果)。但我得到相同的数字重复(很多时候)。这个问题给出了几个例子。哦,我认为这可能是相关的:)好的,我仍然不能理解确切的问题。。但似乎这和种子有关