2012-10-16 32 views
9

我有非常簡單的情況,即待完成的工作可以分解並分配給工人。我試圖從here一個非常簡單的多處理例如:多處理中不同工人的相同輸出

import multiprocessing 
import numpy as np 
import time 

def do_calculation(data): 
    rand=np.random.randint(10) 
    print data, rand 
    time.sleep(rand) 
    return data * 2 

if __name__ == '__main__': 
    pool_size = multiprocessing.cpu_count() * 2 
    pool = multiprocessing.Pool(processes=pool_size) 

    inputs = list(range(10)) 
    print 'Input :', inputs 

    pool_outputs = pool.map(do_calculation, inputs) 
    print 'Pool :', pool_outputs 

上述程序產生以下輸出:

Input : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
0 7 
1 7 
2 7 
5 7 
3 7 
4 7 
6 7 
7 7 
8 6 
9 6 
Pool : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

爲什麼得到印刷相同的隨機數? (我的機器有4個cpus)。這是最好的/最簡單的方法嗎?

+0

[用不同的隨機種子使用Python多處理對於每個過程(可能重複http://stackoverflow.com/questions/9209078/using-python-multiprocessing-with-different- random-seed-for-each-process) – 2015-09-14 15:46:34

+0

有沒有辦法爲每個可能使用隨機數的進程設置隨機數?說一個人使用模塊隨機,numpy,scipy,tensorflow和誰知道還有什麼。是唯一的方法來確保過程有不同的隨機種子通過其中每一個並手動設置狀態? –

回答

12

我想你需要在你的do_calculation函數中使用numpy.random.seed來重新生成隨機數發生器。

我的猜測是隨機數發生器(RNG)在您導入模塊時會播種。然後,當您使用多處理時,您將當前進程與已經播種的RNG分離 - 因此,所有進程都共享RNG的相同種子值,因此它們將生成相同的數字序列。

例如:

def do_calculation(data): 
    np.random.seed() 
    rand=np.random.randint(10) 
    print data, rand 
    return data * 2 
+0

你可以告訴我如何在'do_calculation'中放入'seed'。如果我把'seed'放在'main'中,我仍然會得到類似的輸出。 – imsc

+0

@imsc - 抱歉,我沒有仔細閱讀。你想'np.random.seed'(而不是'random.seed')。我已經相應更新。 – mgilson

+0

我仍然得到類似的結果。 – imsc

相關問題