C ++ TR1: cómo utilizar el normal_distribution?
-
12-09-2019 - |
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!
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)