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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top