Domanda

Sto cercando di usare boost :: normal_distribution al fine di generare una distribuzione normale con media 0 e sigma 1.

Il seguente codice non funziona come alcuni valori sono sopra o al di là -1 e 1 (e non dovrebbe essere). Potrebbe someont sottolineare quello che sto facendo male?

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

Il risultato sulla mia macchina è:

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

Come si può vedere tutti i valori non sono compresi tra -1 e 1.

Grazie a tutti in anticipo!

Modifica :. Questo è ciò che succede quando si hanno le scadenze e di evitare lo studio della teoria prima di fare la pratica

È stato utile?

Soluzione

  

Il seguente codice non funziona come alcuni valori sono sopra o al di là -1 e 1 (e non dovrebbe essere). Potrebbe someont sottolineare quello che sto facendo male?

No, questo è un equivoco della deviazione standard (il secondo parametro nel costruttore 1 ) della distribuzione normale.

La distribuzione normale è la curva a campana familiare. Quella curva ti dice in modo efficace la distribuzione dei valori. Valori prossimi a dove i picchi curva campana hanno più probabilità di valori lontano (la coda della distribuzione).

La deviazione standard spiega come sparsi i valori sono. Minore è il numero, i valori più concentrate sono attorno alla media. Maggiore è il numero, i valori sono meno concentrati attorno alla media. Nell'immagine sottostante si vede che la curva rossa ha una varianza (varianza è il quadrato della deviazione standard) di 0,2. Confrontare questo alla curva verde che ha la stessa media, ma una variazione di 1,0. Si può vedere che i valori nella curva verde sono più sparsi relativamente alla curva rossa. La curva viola ha varianza 5.0 ed i valori sono ancora più estesa.

Quindi, questo spiega perché i valori non si limitano a [-1, 1]. È, tuttavia, un fatto interessante che il 68% dei valori sono sempre entro una deviazione standard della media. Così, come un test interessante per te scrivere un programma per disegnare un gran numero di valori da una distribuzione normale con media 0 e varianza 1 e contare il numero che sono all'interno di una deviazione standard della media. Si dovrebbe ottenere un numero vicino al 68% (68,2689,492137 millions% di essere un po 'più precisi).

alt text

1 : Dalla spinta documentazione :

  

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

     

Costruisce una distribuzione normale con deviazione standard media media e deviazione standard.

Altri suggerimenti

Non stai facendo nulla di male. Per una distribuzione normale, sigma specifica lo standard deviazione, non l'intervallo. Se si genera abbastanza campioni, si vedrà che solo circa 68% di essi si trovano nell'intervallo [media - sigma, media + sigma], circa il 95% entro 2 sigma, e oltre il 99% entro 3 sigma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top