各プロセスに異なるランダムシードを使用してPythonマルチプロセスを使用する 質問する

各プロセスに異なるランダムシードを使用してPythonマルチプロセスを使用する 質問する

シミュレーションの複数のインスタンスを並行して実行したいのですが、各シミュレーションには独自の独立したデータ セットが必要です。

現在、私はこれを次のように実装しています。

P = mp.Pool(ncpus) # Generate pool of workers
for j in range(nrun): # Generate processes
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp)
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp)
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)        
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process
P.close()
P.join() # start processes  

ここでsim、、adatom1およびは、シミュレーションを開始するlattice関数に渡されるオブジェクトです。run

しかし、最近、同時に実行する各バッチ (つまり、シミュレーション実行のncpus合計のうちの各実行nrun) でまったく同じ結果が得られることを発見しました。

これを修正する方法を誰か教えてもらえませんか?

ベストアンサー1

他の人にもわかりやすくするために、実際の回答を追加しようと思いました。

aixからの回答を引用この質問では:

Unix では、すべてのワーカー プロセスが親プロセスから乱数ジェネレーターの同じ状態を継承します。これが、ワーカー プロセスが同一の疑似乱数シーケンスを生成する理由です。

使用ランダムシード()メソッド(またはscipy/numpyの同等のもの)を使用してシードを適切に設定します。このNumpyスレッド

おすすめ記事