簡體   English   中英

為什么 python 多處理總是生成相同的隨機值

[英]Why python multiprocessing always generate same random values

我正在使用 pool.map 來處理我的 function。 function 中添加了一個隨機值。 但我發現每個過程的結果都是一樣的。 如何為每個進程生成不同的隨機值。 這是一個例子:

import numpy as np
from numpy.random import randn
def testfun(X):
    scipy.random.seed
    y = randn()
    return y

from multiprocessing import Pool


pool = mp.Pool(processes = 8)

result = pool.map(testfun,np.arange(8))

我想要有 8 個不同的值。

scipy.random.seed僅引用 function。 您實際上需要使用scipy.random.seed()來調用它。

您需要提供不同的種子值。 您從范圍中獲得的值X將做到這一點。 我無法執行您的代碼,但我創建了它的簡化版本:

from multiprocessing import Pool
import random


def testfun(seed_: int):
    random.seed(seed_)
    y = random.gauss(0, 1)
    return y


if __name__ == "__main__":
    pool = Pool(8)
    result = pool.map(testfun, range(8))
    print(result)

最好將pool放入with上下文管理器的環境中。

您需要做的是為多處理池中的每個進程(而不是每次調用rand )為隨機數生成器播種一次,這樣做的方法是使用池初始化器,即在多處理上指定初始化器參數multiprocessing.Pool構造函數。 您指定的這個 function 將在執行任何任務之前為池中的每個進程調用一次,並且可用於執行任何一次性初始化,例如設置全局變量,或者在這種情況下,為該進程播種隨機數生成器。

import numpy as np
from numpy.random import randn, seed


def init_pool_processes():
    seed()

def testfun(X):
    y = randn()
    return y

# Required by Windows:
if __name__ == '__main__':
    from multiprocessing import Pool

    pool = Pool(processes=8, initializer=init_pool_processes)

    result = pool.map(testfun, np.arange(8))
    print(result)

印刷:

[-0.01738709180801345, -0.6941424935875462, 0.41955492420787543, -0.890711442154167, -0.6894630549510319, 1.1549486347982545, -0.27329303494286733, 0.16447656347746123]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM