Normalverteilte Zufallsgrößen
-
Freut mich, daß ich in deinem Alltag eine kleine Kerze des Humors entzünden konnte, aber du kannst dir sicher denken, daß mir das soviel hilft, als hätte ich mich auf die heiße Herdplatte gesetzt.
*die Hoffnung auf eine Erklärung nicht aufgibt
-
Hmm? Probiers doch einfach aus, oder such in deiner Doku nach den Klassennamen.
-
ich benutze selber msvc6.0 hab aber irgendwo gelesen das der g++ irgenwie so ne lib mit namen acg mitliefert...
bei google hab ich dazu folgendes gefunden...
#include <ACG.h> #include <NegExp.h> int my_seed = 4711; float mean = 1; ACG my_gen (my_seed , 55); //wofür der 2.parameter steht weiss ich jetzt nicht NegativeExpntl exp_rnd (mean , &my_gen); float random_number = exp_rnd();
ist jetzt für exponentialverteilung aber da ist sicher auch normalverteilung bei wenn du die lib irgendwo findest
-
Hallo,
Ich würde an deiner Stelle mal im Matheforum nach Transformation von Gleichverteilten in normalverteilte Zufallszahlen fragen.
Das einzige was ich gefunden hab zu diesem Thema ist eine Delphi oder Pascalimplementation (bin mir nicht sicher was von beiden, kann auch was ganz andres sein)
Oft wird vorgeschlagen, standard-normalverteilte Zufallszahlen nach folgendem Algorithums aus auf dem Einheitsintervall gleichverteilten Zufallszahlen zu erzeugen:
[ randnorm : real is const SUMMANDEN = 12; do Result := -6; for i := 1 to SUMMANDEN do Result := Result + randuniv; end; { randnorm } ]
Dieses Verfahren ist durch den zentralen Grenzwertsatz motiviert. Die Normalverteilung ist die Grenzverteilung der Summe von unabhängigen, identisch verteilten Zufallszahlen, wenn die Zahl der Summanden gegen unendlich geht. 12 ist aber von unendlich zu deutlich verschieden, um dieses Verfahren empfehlenswert zu machen - trotz seiner bestechenden Einfachheit.
Was hier verloren geht ist nicht die Gestalt der Dichte im Intervall [-6, 6], sondern die Möglichkeit von Realisationen ausserhalb dieses Intervalls. Wenn es auf die Möglichkeit von Ausreissern nicht ankommt, oder wenn ohnehin eine abgeschnittene Normalverteilung erzeugt werden soll, dann ist dieses Verfahren verwendbar.
Evtl. kannst du das ja umbauen.
-
double nvZahl(unsigned int size) // unnormierte annaeherung an NV { double Lim=double(size)/RAND_MAX/3.0; double t,m,b; srand( (unsigned)time( NULL ) ); t=rand(); m=rand(); b=rand(); return (t+m+f)*Lim; }
-
vielen Dank für eure Hinweise, hatte bis jetzt Vorlesungen und werd mich jetzt gleich mal ransetzen.
Thx.
-
mein Quellcode bisher:
#include <iostream.h> #include <stdlib.h> double nvZahl(unsigned int size) // unnormierte annaeherung an NV { double Lim=double(size)/RAND_MAX/3.0; double t,m,b; srand( (unsigned)time( NULL ) ); t=rand(); m=rand(); b=rand(); return (t+m+b)*Lim; } main () { double normalvert; for(int i=0; i<100;i++) { int random_number = random(100); cout << random_number << endl; normalvert=nvZahl(random_number); cout << normalvert <<endl; } getchar(); }
Problem: Die erste "Zufalslzahl" war in allen Versuchen die 49. Danach kommt 99 mal eine Andere(aber immer gleiche) Zahl. Diese wechselt von Versuch zu Versuch ist aber jeweils von Durchlauf 1-100 gleich.
also: 1mal49 und dann 99mal55.
Das liegt ja sicher nicht an dem Zufallsgenerator, oder? Wo habe ich denn etwas falsch?
-
nimm mal das raus
srand( (unsigned)time( NULL ) );
und pack es vor die schleife.
-
#include <iostream.h> #include <stdlib.h> double nvZahl(unsigned int size) // unnormierte annaeherung an NV { double Lim=double(size)/RAND_MAX/3.0; double t,m,b; t=rand(); m=rand(); b=rand(); return (t+m+b)*Lim; } main () { double normalvert_a, normalvert_b; double summe=0, durchschnitt; srand( (unsigned)time( NULL ) ); for(int i=0; i<1000;i++) { int random_number=0; random_number = random(100); normalvert_a=nvZahl(random_number); cout << normalvert_a <<endl; summe=summe + random_number; } cout<<endl; cout<<endl; durchschnitt= summe/1000; cout<< summe <<endl; cout<< durchschnitt <<endl; getchar(); }
Die Zahlen, die von der Funktion nvZahl erzeugt werden sehen nicht wirklich normalverteilt aus, sie konzentrieren sich um keinen Wert. Der Durchschnitt liegt aber etwa immer um die 50, also Hälfte von Maximalen Zufallswert. Sollen die Durchschnitte also die normalverteilten Zufallswerte bilden und soll ich diese nochmals in einer Schleife erzeugen und dann erfassen?
@b7f7: Könntest du mir nochmal erklären wieso die Division einer Zufallszahl durch Rand_max und durch 3 eine normalverteilte Zufallszahl erzeugen soll? Ich steig da noch nicht wirklich dahinter.
-
RANDOM_MAX ist der maximalwert den die rand() Funktion zurückliefert.
da ich 3 mall rand() anwende und das mittele muss ich noch durch 3 teilen.
wenn ich nun unendlich mal rand() anwende, muss der Mittelwert aus all diesen werten, da Gleichverteilt, gegen (max-min)/2 Wert der Glecihverteilung streben, da aber nur drei Werte gemittelt werden wird einfach dieser wert und seine umgebung bevorzugt.
P.S. achso wende die funktion doch einfach 1.000.000 mal an und bau dir nen Histogram das sieht eigentlich ganz gut aus
-
alles klar, vielen Dank für deine Hilfe, nun hab ichs auch mathemathisch begriffen.
gruß dekurio