2012-10-16 36 views
9

実行する作業を分割して作業者間で分散できる非常に単純なケースがあります。なぜ、同じ乱数がマルチプロセッシングで異なるワーカーで同じ出力が発生する

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] 

を印刷きている:

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 

上記のプログラムは次の出力を生成します。私はhereから非常に単純なマルチプロセッシングの例を試してみましたか? (私のマシンには4つのCPUがあります)。これは最善の/最も簡単な方法ですか?

+0

[プロセスごとに異なるランダムシードを有する使用Pythonのマルチプロセッシング(の可能重複http://stackoverflow.com/questions/9209078/using-python-multiprocessing-with-different- random-seed-for-each-process) –

+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'を入れる方法を教えてください。私が 'main'に' seed'を置くと、私はまだ同様の出力を得ています。 – imsc

+0

@imsc - 申し訳ありませんが、私は慎重に十分読んでいませんでした。 'random.seed'ではなく' np.random.seed'が必要です。私はそれに応じて更新しました。 – mgilson

+0

私はまだ似たような結果を得ています。 – imsc

関連する問題