Berechnung einer Normalverteilung
-
HALLO.
Ich habe folgenden Code für die Berechnung einer Normalverteilung geschrieben, aber leider funktioniert es nicht. D.h., es kommen eigentlich nie Werte um die 100 zustande (also meinem 'mean'-Wert). Da der Wert 'val' relativ klein ist, werden die gesamten Werte eigentlich nie größer als 1 oder so.
Wie muss ich den Code umwandeln, damit ich eine richtige Gauß-Verteilung mit der Standardabweichung std um den Mittelwert mean erhalte?int main () { int i,anz=100000; double mean,std; vector <double> data; mean = 100; std = 0.5; srand(time(0)); for (i=0;i<anz;i++) data.push_back(Rauschen(mean,std)); return 0; } double Rauschen() { double random,val; random = rand()%201; val = (random - mean)/dev; val = -0.5*val*val; return std::exp(val)/(dev*std::sqrt(2*PHI)); }
Danke.
V.K.
-
Was für eine Sprache verwendest du denn eigentlich? Unter C++ sollte das Beispiel nicht einmal compiliert werden - du verwendest die Funktion Rauschen(), bevor sie deklariert wurde und mit der falschen Anzahl Parameter. (und die von Rauschen() verwendeten Variablen 'mean' und 'dev' sind auch nirgends definiert)
-
HI CStoll,
die Sprache sollte C++ sein. Da ich diesen Codeschnipsel schnell für den Post geschrieben habe, waren da jetzt ein paar Fehler drin. So sollte es richtig sein:
double Rauschen(double mean, double std) { double random,val; random = rand()%201; val = (random - mean)/std; val = -0.5*val*val; return std::exp(val)/(std*std::sqrt(2*PHI)); } int main () { int i,anz=100000; double mean,std; vector <double> data; mean = 100; std = 0.5; srand(time(0)); for (i=0;i<anz;i++) data.push_back(Rauschen(mean,std)); return 0; }
-
Mit der Mathematik kenne ich mich nicht so gut aus, aber vermutlich passt deine Formel nicht so ganz:
(basierend auf mean=100, std=1/2, x=sqrt(2*PHI))
- random liegt in [0,200]
- val=(random-mean)/std liegt in [-200,200]
- val=-0.5*val*val liegt in [-20000,0]
- Rauschen()=e^val/(std*sqrt(2*PHI)) liegt damit in [1e-8600*,2/x]
Was du da hast, rechnet aus, mit welcher Wahrscheinlichkeit der von rand() gelieferte Wert bei deiner Normalverteilung vorkommt. Aber auf diese Weise kannst du keine normalverteilte Zufallsgröße erzeugen.
* also praktisch nicht mehr messbar
-
HI CStoll,
bin gerade auf folgender Seite:
http://c-faq.com/lib/gaussian.htmlVielleicht finde ich ja hier was brauchbares, denn wie du schon sagst, werde ich mit dieser Formel nicht weiterkommen.
V.K.