Kürzlich habe ich mich an moderne Sprachen gewöhnt, zu denen ein guter Zufallsgenerator gehört, normalerweise der Mersenne Twister. Nachdem ich wieder zu C ++ zurückgekehrt bin, muss ich entscheiden, was ich verwenden möchte.
Ich habe nach Mersenne Twister-Implementierungen gesucht und festgestellt, dass es so viele gibt: Gibt es eine, die häufiger verwendet und verbreitet wird, oder soll ich eine auswählen, wenn sie alle gleich gut sind?
Antworten:
C ++ 11 enthält standardmäßig einen Mersenne Twister-Generator als Teil seiner neuen
<random>
Schnittstelle. Um beispielsweise mit MT ganze Zahlen gleichmäßig zwischen [-10, 10] zu generieren, gehen Sie wie folgt vor:Das meiste davon ist auch in jedem Compiler verfügbar, der TR1 anbietet, obwohl die Namen leicht unterschiedlich sind.
std::tr1::mt19937
undstd::tr1::uniform_int<int>
.Normalerweise warne ich Leute davor, Mersenne Twister zu benutzen. Es ist ein akzeptabler Algorithmus, aber ein Großteil seiner Popularität ist nur Marketing. 624 Dimensionen der Zufälligkeit sind mehr als die meisten Menschen brauchen, und MT stellt relativ hohe Zustandsanforderungen, und wenn es eine vollständige Tabellenumrechnung durchführt, kann es den Cache sprengen. Ich persönlich bin ein Teil von xorshift, das exzellente Perioden und angemessene Verteilungen für alles bietet, was ein Spiel benötigt, mit winzigen Speicher- und CPU-Anforderungen.
Ich habe einen (meistens?) C ++ 11-kompatiblen Xorshift-Generator geschrieben - xorshift.hpp , xorshift.cpp - und ihn öffentlich zugänglich gemacht. Sie können dies in eine beliebige C ++ 11-Randomisierungsfunktion wie oben einbinden:
quelle
Ein anderes RNG, das ich zuvor für Spielezwecke verwendet habe, ist Bob Jenkins "kleines" RNG, das hier beschrieben wird .
(Er hat auch ein RNG mit kryptografischer Stärke namens ISAAC, aber es ist größer und langsamer, und Spiele benötigen diese Stärke nicht.)
quelle