Cuando mandamos multiples experimentos aleatorios a distintos cores no queremos que nos repita la generacion de numeros aleatorios sin embargo si no tenemos cuidado cada core estara generando los mismos numeros aleatorios. Paso describir el proceso a realizar
import multiprocessing
# defino una lista con multiples argumentos de entrada
import numpy.random as rnd
arg=[[Kf,Qf] for Kf in [0.01,0.2,0.4] for Qf in [0.05,2,4]] # argumentos para el multiproc
for i in range(len(arg)): # add index for the worker seeds
arg[i].append(i)
a=15 # argumento fijo
seed=14 #argumento fijo
def squarefn(arg):
return [rnd.randn(1),a+arg[0]**2+arg[1]**2]
def squarefn2(arg):
rnd.seed(seed+arg[2])
return [rnd.randn(1),a+arg[0]**2+arg[1]**2]
ncores = multiprocessing.cpu_count()
print(ncores)
res=[]
with multiprocessing.Pool(ncores) as p:
res.append( p.map(squarefn, arg) )
for res0 in res:
print(res0) # notar que repite los numeros aleatorios
with multiprocessing.Pool(ncores) as p:
res.append( p.map(squarefn2, arg) )
for res0 in res:
print(res0) # con esta no los repite