在Python多进程中为每个进程使用不同的随机种子

31 投票
3 回答
24906 浏览
提问于 2025-04-17 12:39

我想同时运行几个模拟,每个模拟都有自己独立的数据集。

目前我这样实现:

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 函数的对象,这个函数用来启动模拟。

不过,我最近发现我同时运行的每一批(也就是每个 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讨论

撰写回答