Question

Je suis en train d'utiliser les C ++ STD TechnicalReport1 extensions pour générer des nombres après une distribution normale, mais ce code (adapté cet article ):

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;
}

imprime seulement 1 "Génération ..." log message, ne sort de la boucle ! Si j'utilise la distribution que je commentais à la place, il se termine, alors je me demande ce que je fais mal. Toute idée?

Merci beaucoup!

Était-ce utile?

La solution

Ce serait certainement pas suspendre le programme. Mais, pas sûr si elle répond vraiment à vos besoins.

 #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); 
 }

Autres conseils

J'ai eu le même problème avec le code initialement affiché et étudié la mise en œuvre de GNU

D'abord quelques observations: avec g ++ - 4.4 et en utilisant les codes se bloque, avec g ++ - 4.5 et en utilisant std = c ++ 0x (à savoir pas TR1, mais la chose réelle) au-dessus du code fonctionne

à mon humble avis, il y avait un changement entre TR1 et c ++ 0x ce qui concerne les adaptateurs entre génération de nombres aléatoires et la consommation de nombres aléatoires - mt19937 produit des entiers, normal_distribution consomme double

c ++ 0x utilise une adaptation automatique, le g ++ Code TR1 ne pas

afin d'obtenir votre code de travail avec g ++ - 4.4 et TR1, procédez comme suit

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();

Si votre TR1 nombre aléatoire la mise en œuvre de génération est bogué, vous pouvez éviter TR1 en écrivant votre propre générateur normale comme suit.

Générer deux uniforme (0, 1) des échantillons aléatoires u et v en utilisant tout générateur aléatoire de confiance. Ensuite, laissez r = sqrt (-2 log (u)) et retour x = r sin (2 pi v). (On appelle la méthode Box-Mueller.)

Si vous avez besoin d'échantillons d'échantillons normaux avec moyenne mu et écart-type sigma, retour sigma * x + mu au lieu d'x.

Bien que cela semble être un bug, une confirmation rapide serait de passer la valeur par défaut 0.0, 1.0 paramètres. normal_distribution<double>::normal_distribution() doit être égale à normal_distribution<double>::normal_distribution(0.0, 1.0)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top