Pregunta

I Estoy intentando utilizar los C ++ STD TechnicalReport1 extensiones para generar números siguiendo una distribución normal, pero este código (adaptado de este artículo ):

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

1 sólo se imprime "Generar ..." mensaje de registro, a continuación, nunca se sale del bucle for ! Si utilizo la distribución Comenté a cabo en su lugar, termina, por lo que me pregunto lo que estoy haciendo mal. Alguna idea?

Muchas gracias!

¿Fue útil?

Solución

Esto definitivamente no colgaría el programa. Sin embargo, no está seguro de si realmente se adapte a sus necesidades.

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

Otros consejos

He tenido el mismo problema con el código originalmente publicado e investigado la implementación GNU de

En primer lugar algunas observaciones: con g ++ - 4,4 y el uso de los bloqueos de código, con g ++ - 4,5 y el uso de -std = c ++ 0x (es decir, no TR1 pero la cosa real) por encima de código funciona

mi humilde opinión, hubo un cambio entre TR1 y c ++ 0x con respecto a los adaptadores entre la generación de números aleatorios y el consumo de números aleatorios - mt19937 produce números enteros, normal_distribution consume dobles

el c ++ 0x utiliza adaptación de forma automática, el código g ++ TR1 hace no

con el fin de obtener su código de trabajo con g ++ - 4.4 y TR1, haga lo siguiente

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 su aplicación TR1 generación de números aleatorios está libre de errores, puede evitar TR1 escribiendo su propio generador normal de la siguiente.

generar dos uniforme (0, 1) muestras aleatorias U y V utilizando cualquier generador aleatorio de su confianza. A continuación, dejar que r = sqrt (-2 log (u)) y devolver x = r sen (2 pi v). (Esto se denomina el método de Box-Mueller.)

Si necesita muestras de muestras normales con una media mu y sigma desviación estándar, volver sigma * x + mu en lugar de sólo x.

Si bien esto parece ser un error, una confirmación rápida sería pasar el valor por defecto 0.0, 1.0 parámetros. normal_distribution<double>::normal_distribution() debe ser igual normal_distribution<double>::normal_distribution(0.0, 1.0)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top