C ++ TR1: Wie die normal_distribution benutzen?
-
12-09-2019 - |
Frage
Ich versuche, die C ++ STD TechnicalReport1 Erweiterungen verwenden Zahlen generieren eine Normalverteilung folgen, aber dieser Code (angepasst von dieser Artikel ):
mt19937 eng;
eng.seed(SEED);
normal_distribution<double> dist;
// XXX if I use the one below it exits the for loop
// uniform_int<int> dist(1, 52);
for (unsigned int i = 0; i < 1000; ++i) {
cout << "Generating " << i << "-th value" << endl;
cout << dist(eng) << endl;
}
druckt nur 1 "Erstellen ..." -Meldung einzuloggen, dann nie die for-Schleife beendet ! Wenn ich die Verteilung verwende ich, anstatt kommentiert, beendet sie, so frage ich mich, was ich falsch mache. Jede Idee?
Vielen Dank!
Lösung
Das auf jeden Fall würde das Programm nicht hängen. Aber nicht sicher, ob es wirklich Ihren Bedürfnissen entspricht.
#include <random>
#include <iostream>
using namespace std;
typedef std::tr1::ranlux64_base_01 Myeng;
typedef std::tr1::normal_distribution<double> Mydist;
int main()
{
Myeng eng;
eng.seed(1000);
Mydist dist(1,10);
dist.reset(); // discard any cached values
for (int i = 0; i < 10; i++)
{
std::cout << "a random value == " << (int)dist(eng) << std::endl;
}
return (0);
}
Andere Tipps
Ich habe das gleiche Problem mit dem Code hatte ursprünglich geschrieben und untersuchte die GNU-Implementierung von
zunächst einige Beobachtungen: mit g ++ - 4.4 und der Code hängt mit, mit g ++ - 4.5 und mit -std = c ++ 0x (das heißt nicht TR1 aber das Eigentliche) über Code funktioniert
IMHO, es war ein Wechsel zwischen TR1 und C ++ 0x bezüglich Adapter zwischen Erzeugung von Zufallszahlen und dem Verbrauch von Zufallszahlen - MT19937 ganzen Zahlen erzeugt, normal_distribution verbraucht verdoppelt
Die C ++ 0x verwendet Anpassung automatisch der g ++ TR1 Code nicht
, um Ihren Code zu erhalten arbeiten mit g ++ - 4.4 und TR1, gehen Sie wie folgt
std::tr1::mt19937 prng(seed);
std::tr1::normal_distribution<double> normal;
std::tr1::variate_generator<std::tr1::mt19937, std::tr1::normal_distribution<double> > randn(prng,normal);
double r = randn();
Wenn Sie Ihre TR1 Erzeugung von Zufallszahlen Implementierung Buggy ist, können Sie TR1 vermeiden, indem Sie Ihre eigenen normalen Generator Schreiben wie folgt.
Generieren zwei Uniform (0, 1) Stichproben u und v unter Verwendung eines beliebigen Zufallsgenerator Sie vertrauen. Dann r = sqrt (-2 log (u)) und das Rück x = r sin (2 & pi v) lassen. (Dies ist die Box-Mueller-Methode genannt).
Wenn Sie mit dem Mittelwert mu und Standardabweichung Sigma normale Proben Proben benötigen, kehrt Sigma * x + mu statt nur x.
Während dies ein Fehler zu sein scheint, eine schnelle Bestätigung wäre der Standard 0.0 passieren, 1.0 Parameter. normal_distribution<double>::normal_distribution()
sollte normal_distribution<double>::normal_distribution(0.0, 1.0)
gleich