Pregunta

Estoy tratando de impulsar el uso :: normal_distribution con el fin de generar una distribución normal con media 0 y sigma 1.

El siguiente código no funciona como algunos valores son por encima o más allá de -1 y 1 (y no debe ser). someont podría señalar lo que estoy haciendo mal?

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>

int main()
{
  boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)

  boost::normal_distribution<> nd(0.0, 1.0);

  boost::variate_generator<boost::mt19937&, 
                           boost::normal_distribution<> > var_nor(rng, nd);

  int i = 0; for (; i < 10; ++i)
  {
    double d = var_nor();
    std::cout << d << std::endl;
  }
}

El resultado en mi máquina es:

0.213436
-0.49558
1.57538
-1.0592
1.83927
1.88577
0.604675
-0.365983
-0.578264
-0.634376

Como se puede ver todos los valores no están entre -1 y 1.

Gracias a todos por adelantado!

Editar . Esto es lo que sucede cuando se tiene plazos y evitar el estudio de la teoría antes de hacer la práctica

¿Fue útil?

Solución

  

El siguiente código no funciona como algunos valores son por encima o más allá de -1 y 1 (y no debe ser). someont podría señalar lo que estoy haciendo mal?

No, esto es un malentendido de la desviación estándar (el segundo parámetro en el constructor 1 ) de la distribución normal.

La distribución normal es la curva de campana familiar. Esa curva de eficacia con la que cuenta la distribución de los valores. Los valores cercanos a donde los picos de la curva de campana son más propensas que los valores de lejos (la cola de la distribución).

La desviación estándar se indica cómo se extienden los valores son. Cuanto menor sea el número, los valores más concentradas son alrededor de la media. La mayor sea el número, los valores menos concentradas son alrededor de la media. En la imagen de abajo se puede ver que la curva roja tiene una varianza (varianza es el cuadrado de la desviación estándar) de 0,2. Compare esto con la curva verde, que tiene la misma media pero una variación de 1,0. Se puede ver que los valores de la curva verde están más extendidas en relación con la curva roja. La curva morado tiene varianza 5.0 y los valores aún más se extendió a cabo.

Por lo tanto, esto explica por qué los valores no se limitan a [-1, 1]. Es, sin embargo, un hecho interesante que el 68% de los valores están siempre dentro de una desviación estándar de la media. Por lo tanto, como una prueba interesante para usted escribir un programa para dibujar un gran número de valores de una distribución normal con media 0 y varianza 1 y contar el número que están dentro de una desviación estándar de la media. Usted debe obtener un número cercano a 68% (68.2689492137% a ser un poco más precisos).

alt texto

1 : Desde el impulso documentación :

  

normal_distribution(RealType mean = 0, RealType sd = 1);

     

Construye una distribución normal con media sd media y la desviación estándar.

Otros consejos

Usted no está haciendo nada malo. Para una distribución normal, sigma especifica el estándar desviación, no la gama. Si genera suficientes muestras, se verá que sólo alrededor 68% de ellos se encuentran en el intervalo [media - sigma, significa + sigma], aproximadamente el 95% dentro de 2 sigma, y más de 99% a menos de 3 sigma.

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