numpy.random在多進(jìn)程環(huán)境下重復(fù)生成隨機(jī)數(shù)的問(wèn)題

python多進(jìn)程環(huán)境調(diào)用np.random()時(shí), 默認(rèn)每個(gè)進(jìn)程會(huì)有相同的初始狀態(tài), 如果直接使用, 每個(gè)進(jìn)程生成的隨機(jī)序列會(huì)完全一致.

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()

輸出結(jié)果可以看到,每個(gè)進(jìn)程輸出的序列均一致:

[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]

如果不希望這種情況發(fā)生, 而是每個(gè)進(jìn)程都是獨(dú)立產(chǎn)生隨機(jī)數(shù),需要在每個(gè)進(jìn)程開始處對(duì)np.random初始化, 可以在每個(gè)進(jìn)程用np.random.RandomState() 生成一個(gè)新的隨機(jī)數(shù)引擎實(shí)例

import numpy as np
import multiprocessing

def gen_value(randomstate):
    values = []
    for i in range(10):
        values.append(randomstate.randint(100))   # 使用randomstart生成隨機(jī)數(shù)
    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()

輸出結(jié)果:

[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, 也會(huì)在每個(gè)進(jìn)程初始化隨機(jī)種子.

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容