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