Ho bisogno di eseguire simulazioni MonteCarlo in parallelo su macchine diverse. Il codice è in C++, ma il programma è impostato e lanciato con uno script python che imposta molte cose, in particolare il seed casuale. La funzione setSeed thake un 4 byte unsigned integerMiglior seme per processo parallelo
Utilizzando un semplice
import time
setseed(int(time.time()))
non è molto buona, perché presento i lavori a una coda in un cluster, rimangono in attesa per qualche minuto poi si inizia, ma l'ora di inizio è impredicible, può essere che due lavori iniziano allo stesso tempo (secondi), in modo da passare a:
setseet(int(time.time()*100))
ma non sono felice. Qual è la soluzione migliore? Forse posso combinare le informazioni da: tempo, id macchina, id processo. O forse la soluzione migliore è leggere da/dev/random (macchine Linux)?
Come leggere 4 byte da/dev/random?
f = open("/dev/random","rb")
f.read(4)
dammi una stringa, voglio un numero intero!
In realtà non hai detto cosa consiti "il migliore". Suppongo che tu stia cercando di assicurare che ogni istanza usi un seme diverso. Ma, dovrebbero essere unici tra i diversi lavori in una singola corsa, o avete bisogno di qualcosa che si avvicini (o che sia garantito) all'unicità globale (tutti eseguiti e tutti i lavori). In secondo luogo, è necessario essere in grado di ripetere una corsa con gli stessi semi (a volte utile nel debugging intermittente). E potrebbero esserci altre complicazioni. – dmckee
Voglio seme casuale per ogni istanza, quindi se il seme è da 0 a 2^(8 * 4) -1 è molto probabile che i semi siano diversi per ogni istanza. Non costringo i semi a essere diversi, anche se forse sarebbe meglio se lo fossero. Penso che non sia un grosso problema. Non è necessario ripetere l'esecuzione con lo stesso seme. –
Bene, questo è il caso facile e hai già buone risposte. Saluti. – dmckee