使用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  

其中simadatom1lattice是传递给发起模拟的函数run的对象。

然而,我最近发现,我同时运行的每个批次(即,模拟运行的总nrun中的每个ncpus)都会给出完全相同的结果。

这里有人能告诉我们如何解决这个问题吗?

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

引用aix对这个问题的回答:

发生的情况是,在Unix上,每个工作进程都继承相同的来自父进程的随机数生成器的状态。这是为什么它们生成相同的伪随机序列。

使用random.seed()方法(或scipy/numpy等效方法)正确设置种子。另请参阅此numpy线程。

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

np.random.seed((os.getpid() * int(time.time())) % 123456789)

问题的解决方案是在函数run中使用scipy.random.seed(),该函数为从run调用的随机函数分配一个新种子。

在多处理中也可以找到类似的问题(我从中得到了解决方案)。Pool似乎在Windows中可用,但在ubuntu中不可用?

最新更新