对每个进程使用带有不同随机种子的python多处理

Mic*_*ant 20 python multiprocessing

我希望并行运行几个模拟实例,但每个模拟都有自己独立的数据集.

目前我实现如下:

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  
Run Code Online (Sandbox Code Playgroud)

在那里sim,adatom1并且lattice是传递给函数的对象run从而开始模拟.

但是,我最近发现我同时运行的每个批次(也就是说,每次ncpus运行nrun模拟运行的总数)都给出了完全相同的结果.

有人可以在这启发如何解决这个问题吗?

dgo*_*sen 19

只是想我会添加一个实际的答案,以便让其他人明白.

在这个问题中引用aix的答案:

会发生什么是在Unix上,每个工作进程都从父进程继承随机数生成器的相同状态.这就是他们生成相同的伪随机序列的原因.

使用random.seed()方法(或scipy/numpy等效方法)正确设置种子.另见这个numpy线程.


ale*_*lik 7

这是一个未解决的问题。尝试为每个进程生成唯一的种子。您可以将以下代码添加到函数的开头来解决该问题。

np.random.seed((os.getpid() * int(time.time())) % 123456789)
Run Code Online (Sandbox Code Playgroud)