在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
模拟中运行)得到的结果都是完全一样的。
有没有人能告诉我该怎么解决这个问题?
3 个回答
1
解决这个问题的方法是,在函数 run
中使用 scipy.random.seed()
,这样可以为从 run
调用的随机函数分配一个新的种子。
我找到这个解决方案是因为遇到了一个类似的问题,具体可以参考这个链接:multiprocessing.Pool在Windows上似乎可以工作,但在Ubuntu上却不行?
7
这是一个尚未解决的问题。你可以为每个进程生成一个独特的种子。为了避免这个问题,你可以在函数的开头添加下面的代码。
np.random.seed((os.getpid() * int(time.time())) % 123456789)
31
我想补充一个实际的答案,让其他人更清楚。
引用aix在这个问题中的回答:
在Unix系统上,每个工作进程都会从父进程那里继承相同的随机数生成器状态。这就是为什么它们会生成相同的伪随机序列。
使用random.seed()方法(或者scipy/numpy的类似方法)来正确设置种子。还可以查看这个numpy讨论。