Die C++11-Standardbibliothek enthält ein anständiges Gerüst und einige brauchbare Generatoren, was für Hausaufgaben und den spontanen Einsatz vollkommen ausreicht.
Für produktiven Code sollten Sie jedoch genau wissen, welche spezifischen Eigenschaften die verschiedenen Generatoren haben, bevor Sie sie verwenden, da sie alle ihre Tücken haben. Außerdem besteht keiner von ihnen Standardtests für PRNGs wie TestU01, mit Ausnahme der Ranlux-Generatoren, wenn sie mit einem großzügigen Luxusfaktor verwendet werden.
Wenn Sie solide, wiederholbare Ergebnisse erzielen wollen, müssen Sie Ihren eigenen Generator mitbringen.
Wenn Sie mobil sein wollen, müssen Sie Ihren eigenen Generator mitbringen.
Wenn Sie mit der eingeschränkten Portabilität leben können, können Sie boost oder das C++11-Framework in Verbindung mit Ihren eigenen Generatoren verwenden.
Weitere Einzelheiten - einschließlich des Codes für einen einfachen und schnellen Generator von hervorragender Qualität und reichlich Links - finden Sie in meinen Antworten zu ähnlichen Themen:
Für professionelle einheitliche Gleitkommaabweichungen gibt es zwei weitere Punkte zu beachten:
- offener vs. halboffener vs. geschlossener Bereich, d. h. (0,1), [0, 1) oder [0,1]
- Methode der Umwandlung von Integral- in Gleitkommazahlen (Genauigkeit, Geschwindigkeit)
Beides sind eigentlich zwei Seiten derselben Medaille, denn die Umrechnungsmethode sorgt für den Einschluss bzw. Ausschluss von 0 und 1. Hier sind drei verschiedene Methoden für das halboffene Intervall:
// exact values computed with bc
#define POW2_M32 2.3283064365386962890625e-010
#define POW2_M64 5.421010862427522170037264004349e-020
double random_double_a ()
{
double lo = random_uint32() * POW2_M64;
return lo + random_uint32() * POW2_M32;
}
double random_double_b ()
{
return random_uint64() * POW2_M64;
}
double random_double_c ()
{
return int64_t(random_uint64()) * POW2_M64 + 0.5;
}
( random_uint32()
y random_uint64()
sind Platzhalter für Ihre eigentlichen Funktionen und würden normalerweise als Template-Parameter übergeben werden)
Methode a demonstriert, wie man eine einheitliche Abweichung erzeugt, die nicht durch übermäßige Präzision für niedrigere Werte verzerrt wird; der Code für 64-Bit wird nicht gezeigt, da er einfacher ist und nur die Maskierung von 11 Bits beinhaltet. Die Verteilung ist für alle Funktionen gleichmäßig, aber ohne diesen Trick gäbe es mehr unterschiedliche Werte in dem Bereich, der näher an 0 liegt als anderswo (feinere Rasterabstände aufgrund des variierenden ulp).
Methode c zeigt, wie man auf bestimmten gängigen Plattformen, auf denen die FPU nur einen vorzeichenbehafteten 64-Bit-Integraltyp kennt, eine einheitliche Abweichung schneller erreichen kann. Was Sie am häufigsten sehen, ist die Methode b aber dort muss der Compiler unter der Haube eine Menge zusätzlichen Code erzeugen, um die vorzeichenlose Semantik zu erhalten.
Kombinieren Sie diese Prinzipien, um Ihre eigene maßgeschneiderte Lösung zu schaffen.
All dies wird in Jürgen Doorniks ausgezeichnetem Aufsatz erläutert Umwandlung von Zufallszahlen mit hoher Periode in Fließkommazahlen .