numpy.random在多進程環境下重復生成隨機數的問題

python多進程環境調用np.random()時, 默認每個進程會有相同的初始狀態, 如果直接使用, 每個進程生成的隨機序列會完全一致.

import numpy as np
import multiprocessing

def gen_value():
    values = list()
    for i in range(10):
        values.append(np.random.randint(100))
    print(values)

procs = [multiprocessing.Process(target=gen_value) for _ in range(10)]
for p in proces:
    p.start()
    p.join()

輸出結果可以看到,每個進程輸出的序列均一致:

[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]  
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]
[62, 96, 91, 48, 18, 72, 21, 78, 74, 86]

如果不希望這種情況發生, 而是每個進程都是獨立產生隨機數,需要在每個進程開始處對np.random初始化, 可以在每個進程用np.random.RandomState() 生成一個新的隨機數引擎實例

import numpy as np
import multiprocessing

def gen_value(randomstate):
    values = []
    for i in range(10):
        values.append(randomstate.randint(100))   # 使用randomstart生成隨機數
    print(values)

procs = [multiprocessing.Process(target=gen_value, args=(np.random.RandomState(),)) for i in range(10)]

for p in procs:
    p.start()
    p.join()

輸出結果:

[39, 25, 65, 93, 71, 10, 27, 28, 93, 51]
[79, 40, 64, 58, 18, 48, 93, 68, 99, 15]
[39, 31, 85, 31, 69, 91, 85, 71, 59, 82]
[49, 58, 56, 23, 52, 65, 59, 84, 37, 26]
[35, 99, 3, 27, 16, 83, 85, 42, 76, 43]
[37, 62, 2, 30, 75, 14, 18, 79, 81, 9]
[93, 17, 62, 86, 38, 10, 46, 30, 68, 44]
[87, 52, 15, 44, 11, 69, 93, 5, 14, 89]
[83, 2, 81, 75, 95, 33, 21, 98, 92, 43]
[8, 36, 42, 19, 89, 80, 7, 2, 77, 56]

或者使用python原生的random模塊替換np.random, 也會在每個進程初始化隨機種子.

參考:
https://stackoverflow.com/questions/29854398/seeding-random-number-generators-in-parallel-programs

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。