我想使用多重处理在 Numpy 中生成随机数。使用这个这个答案我在这条消息的末尾写了代码,它似乎有效。因为我链接到的答案很旧,所以我想确保它仍然正确。 Numpy 的官方文档似乎说
np.random.seed
已被弃用,但我似乎找不到关于它推荐的 Generator 实例的好的文档,而且看起来更复杂。
import numpy as np
from multiprocessing import Pool
def generate_random(iproc):
# if then next line is commented then each process produces same random numbers
np.random.seed()
nums = np.random.uniform(size=8)
print(f'{iproc=},{nums=}')
if __name__ == '__main__':
nproc = 8
arglist = []
for iproc in range(nproc):
arglist.append((iproc,))
with Pool(nproc) as p:
p.starmap(generate_random, arglist)
为了避免共享全局随机状态对象,您可以使用不同的种子为子进程播种。以下是如何使用 Numpy 的生成器 API 实现此目的的最小示例:
import numpy as np
from multiprocessing import Pool
def generate_random(idx_proc, seed):
random_state = np.random.RandomState(seed)
nums = random_state.uniform(size=8)
print(f"{idx_proc=}, {nums=}")
if __name__ == "__main__":
n_proc = 8
random_state = np.random.RandomState(480273)
seeds = random_state.randint(0, 2**32-1, n_proc)
with Pool(n_proc) as p:
p.starmap(generate_random, enumerate(seeds))
通过在主进程中使用随机状态对象并从中生成种子,您将获得可重现的结果(但请记住,进程运行的顺序和计算数字可能无法重现!)。
我希望这有帮助!