Ich mag die Zufallszahl-Verteilungen aus der C++ 11-Standardbibliothek mit einfachen Funktionen wickeln, dass die Parameter der Verteilung und einen Generator Instanz als Argument. Zum Beispiel:Sollte ich Reset() auf meine zufällige C++ - Verteilung aufrufen, um den versteckten Status zu löschen?
double normal(double mean, double sd, std::mt19937_64& generator)
{
static std::normal_distribution<double> dist;
return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
Ich mag jeden versteckten Zustand innerhalb des Verteilungsobjekts vermeiden, so dass jeder Aufruf dieser Wrapper-Funktion auf den angegebenen Argumenten hängt nur. (Potentiell jeder Aufruf dieser Funktion könnte einen anderen Generator Beispiel nehmen.) Idealerweise würde ich die Verteilung Instanz static const
machen dies zu gewährleisten; Die operator()
der Distribution ist jedoch keine konstante Funktion, daher ist dies nicht möglich.
Meine Frage ist dies: Um sicherzustellen, dass es keinen versteckten Zustand innerhalb der Verteilung gibt, ist es 1) notwendig und 2) ausreichend, um reset()
auf der Verteilung jedes Mal aufzurufen? Zum Beispiel:
double normal(double mean, double sd, std::mt19937_64& generator)
{
static std::normal_distribution<double> dist;
dist.reset();
return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
(Insgesamt bin ich verwirrt über den Zweck der reset()
Funktion für die Zufallsverteilungen ... Ich verstehe, warum der Generator manchmal Reset/reseeded sein müssten, aber warum sollte die Verteilungsobjekt müssen zurückgesetzt werden?)
Danke für die sehr hilfreiche Antworten und Kommentare alle! –
Ich denke, ich werde meine Gesamtstrategie nach dem Lesen der Antworten ändern: Ich werde entweder meinen Generator und die Verteilung binden (was der beabsichtigte Einsatz zu sein scheint, anstatt mehreren Generatoren die Verwendung des gleichen Verteilungsobjekts zu erlauben), oder einfach benutze die Generatoren der std lib, ignoriere aber die Verteilungsfunktionen (nachdem du herausgefunden hast, dass die Distributionen nicht unbedingt portabel sind: http://stackoverflow.com/questions/14840901/is-the-random-library-in-c11-portable, also selbst mit dem gleichen Seed, kann ich verschiedene Sequenzen von zB Normalverteilungsproben auf verschiedenen Plattformen erhalten). –
Es scheint hier zwei Anwendungsfälle zu geben: 1) Bindung eines Motors und Verteilung (die beabsichtigte Verwendung) und 2) Verwendung mehrerer Engines mit einer Verteilung (was ich hier mache). Ich denke, ich bevorzuge es, die Verteilungen als einfache zustandslose Funktionen zu betrachten: Sie geben ihnen eine Engine und sie geben eine Stichprobe zurück. Aber ich verstehe die Notwendigkeit, sie als Objekte zu behandeln, damit sie Werte für Effizienz speichern können. Es wäre schön gewesen, wenn der Standard für jede Distribution sowohl eine zustandslose Funktion, um nur ein * Sample zu erhalten, als auch ein Objekt zum Erzeugen/Cachen * mehrerer * Samples zur Verfügung stellen würde. –