Frage

Ich versuche zu verwenden boost :: normal_distribution um eine Normalverteilung mit einem Mittelwert von 0 und sigma 1.

zu erzeugen,

Der folgende Code funktioniert nicht wie einige Werte über oder jenseits -1 und 1 (und sollte nicht). Könnte someont darauf hinweisen, was ich falsch mache?

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

Das Ergebnis auf meiner Maschine ist:

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

Wie Sie alle Werte sind nicht zwischen sehen -1 und 1.

Vielen Dank im Voraus!

Bearbeiten . Dies ist, was passiert, wenn man Termine und vermeiden Sie haben das Studium der Theorie vor der Praxis tun

War es hilfreich?

Lösung

  

Der folgende Code funktioniert nicht wie einige Werte über oder jenseits -1 und 1 (und sollte nicht). Könnte someont darauf hinweisen, was ich falsch mache?

Nein, das ist ein Missverständnis der Standardabweichung (der zweite Parameter im Konstruktor 1 ) der Normalverteilung.

Die Normalverteilung ist die bekannte Glockenkurve. Diese Kurve zeigt Ihnen effektiv die Verteilung der Werte. Werte schließen die Glockenkurve Spitzen sind eher als Werte weit weg (der Schwanz der Verteilung), wo.

Die Standardabweichung zeigt Ihnen, wie ausgebreitete die Werte sind. Je kleiner die Zahl, desto mehr konzentrierte Werte um den Mittelwert. Je größer die Zahl, desto weniger konzentrierte Werte um den Mittelwert. Im Bild unten sehen Sie, dass die rote Kurve eine Varianz (Varianz das Quadrat der Standardabweichung) von 0,2. Vergleichen Sie dies mit der grünen Kurve, die den gleichen Mittelwert aber eine Abweichung von 1,0 hat. Sie können sehen, dass die Werte in der grünen Kurve mehr an die rote Kurve relativ ausgebreitet. Die violette Kurve hat Varianz 5.0 und die Werte werden noch verteilt.

Also, das erklärt, warum die Werte sind nicht auf [-1, 1] beschränkt. Es ist jedoch eine interessante Tatsache, dass 68% der Werte immer innerhalb einer Standardabweichung vom Mittelwert ist. So, wie ein interessanter Test für dich selbst ein Programm schreiben, eine große Anzahl von Werten aus einer Normalverteilung mit Mittelwert 0 und Varianz 1 und zählen die Anzahl zu zeichnen, die innerhalb einer Standardabweichung vom Mittelwert sind. Sie sollten eine Nummer der Nähe von 68% erhalten (68,2689492137% ein wenig genauer zu sein).

alt text

1 : Vom Schub Dokumentation :

  

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

     

Konstruiert eine Normalverteilung mit Mittelwert Mittelwert und Standardabweichung sd.

Andere Tipps

Sie sind nicht etwas falsch zu machen. Für eine Normalverteilung gibt die Standard-sigma Abweichung, nicht die Reichweite. Wenn Sie genügend Proben zu erzeugen, werden Sie sehen, dass nur etwa 68% davon liegt im Bereich [Mittelwert - Sigma, Mittelwert + sigma], etwa 95% innerhalb von 2 Sigma, und mehr als 99% innerhalb von 3 Sigma.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top