Beste Möglichkeit, mt19937_64 für Monte-Carlo-Simulationen zu verwenden
Ich arbeite an einem Programm, das eine Monte-Carlo-Simulation ausführt. Insbesondere verwende ich einen Metropolis-Algorithmus. Das Programm muss möglicherweise Milliarden von "Zufallszahlen" erzeugen. Ich weiß, dass der Mersenne-Twister für die Monte-Carlo-Simulation sehr beliebt ist, aber ich möchte sicherstellen, dass ich den Generator bestmöglich aussetze.
Gegenwärtig berechne ich einen 32-Bit-Startwert mit der folgenden Methode:
mt19937_64 prng; //pseudo random number generator
unsigned long seed; //store seed so that every run can follow the same sequence
unsigned char seed_count; //to help keep seeds from repeating because of temporal proximity
unsigned long genSeed() {
return ( static_cast<unsigned long>(time(NULL)) << 16 )
| ( (static_cast<unsigned long>(clock()) & 0xFF) << 8 )
| ( (static_cast<unsigned long>(seed_count++) & 0xFF) );
}
//...
seed = genSeed();
prng.seed(seed);
Ich habe das Gefühl, dass es viel bessere Möglichkeiten gibt, um sicherzustellen, dass sich neue Samen nicht wiederholen, und ich bin mir ziemlich sicher, dass mt19937_64 mit mehr als 32 Bit gesät werden kann. Hat jemand irgendwelche Vorschläge?