Ich suchen eine Routine (am besten in C/C++) zur Erzeugung von Normalverteilten
Zufallszahlen. Weiss jemand da was ?
Tschuess,
Carsten.
--
Carsten Krebs, Pfalzburger Str. 49, 10717 Berlin (Germany), Tel: 861 86 52
ca...@cs.tu-berlin.de or vis...@zelator.in-berlin.de
Nach dem zentralen Grenzwertsatz kannst Du 12 uniform [0:1] verteilte
Zufallsvariablen addieren and 6 abziehen. Ist einfach und fuer die
meisten Zwecke gut genug...
-=-----
Christian Burger, Dept.of Phys.Chemistry, University of Marburg, Germany
e-mail: bur...@mailer.uni-marburg.de, (Phone|FAX): +49-6421-28-57(89|78)
Aber unsch"on.
Was man braucht, um irgendwie verteilte Zufallszahlen zu erzeugen,
(exakt und ohne Tricks (wie rejection method))
ist die inverse Funktion des Integrals der Dichte. F"ur die
Normalverteilung in 1 Dimension geht das nicht (man br"auchte
inv erf), aber in 2 Dimensionen geht das, da das Integral vom Gauss
in R^2 elementar ist. Der Algorithmus hei"st Box-Muller und steht
irgendwo in den Numerical recipes.
Ralf
--
--
to get PGP key: finger p...@hpux.rz.uni-jena.de (or from public key servers)
pgp public key fingerprint=A3 93 A6 0B E2 8F 04 25 5B 3C 00 F6 55 E5 64 20
>Carsten Krebs (ca...@cs.tu-berlin.de) wrote:
>: Ich suchen eine Routine (am besten in C/C++) zur Erzeugung von Normalverteilten
>: Zufallszahlen. Weiss jemand da was ?
>Nach dem zentralen Grenzwertsatz kannst Du 12 uniform [0:1] verteilte
>Zufallsvariablen addieren and 6 abziehen. Ist einfach und fuer die
>meisten Zwecke gut genug...
Kannst Du den mal etwas naeher erlaeutern? Ich kenne zwar wohl einige
Algorithmen, um Pseudo-Zufallszahlen zu erzeugen, aber irgendwie will
mir nicht so ganz in den Kopf, warum es bei Deinem Verfahren gerade
*zwoelf* "Zufallszahlen" sein sollen...
Daniel
--
Daniel Roedding : dan...@fiction.pb.owl.de, zlr...@pbhrzx.uni-paderborn.de
Detmolder Str. 19 :.........................................................
D-33102 Paderborn :"Die Zufallszahl ist gleich der Anzahl der Scherben ei-
(05251) 541965 voice: ner Tasse, die aus 1 m Hoehe bei Normalbedingungen auf
(05251) 541334 data : ortsgemischten B11-Beton faellt" (Gnomic-Regelvorschlag)
: >Carsten Krebs (ca...@cs.tu-berlin.de) wrote:
: >: Ich suchen eine Routine (am besten in C/C++) zur Erzeugung von Normalverteilten
: >: Zufallszahlen. Weiss jemand da was ?
: >Nach dem zentralen Grenzwertsatz kannst Du 12 uniform [0:1] verteilte
: >Zufallsvariablen addieren and 6 abziehen. Ist einfach und fuer die
: >meisten Zwecke gut genug...
: Kannst Du den mal etwas naeher erlaeutern? Ich kenne zwar wohl einige
: Algorithmen, um Pseudo-Zufallszahlen zu erzeugen, aber irgendwie will
: mir nicht so ganz in den Kopf, warum es bei Deinem Verfahren gerade
: *zwoelf* "Zufallszahlen" sein sollen...
Die Varianz einer Rechteckfunktion der Breite 1 ist 1/12. Wenn man
nicht genau 12 Zufallszahlen addiert, kommt noch ein Faktor hinzu. Mit
12 Zufallszahlen ist die Annaeherung an die Normalverteilung schon sehr
gut, und IMHO ist das Verfahren nicht unschoen, sondern elegant.
>>Nach dem zentralen Grenzwertsatz kannst Du 12 uniform [0:1] verteilte
>>Zufallsvariablen addieren and 6 abziehen. Ist einfach und fuer die
>>meisten Zwecke gut genug...
>Kannst Du den mal etwas naeher erlaeutern? Ich kenne zwar wohl einige
>Algorithmen, um Pseudo-Zufallszahlen zu erzeugen, aber irgendwie will
>mir nicht so ganz in den Kopf, warum es bei Deinem Verfahren gerade
>*zwoelf* "Zufallszahlen" sein sollen...
Die 12 ist mathematisch rein willkuerlich. Der zentrale Grenzwertsatz besagt
so im Prinzip nur, dass die Summe (und damit auch der Mittelwert) von n
gleich verteilten (nicht notwendig gleichverteilten) Zufallsvariablen immer
für wachsendes n immer "besser" normalverteilt ist.
Fazit: Je mehr Zufallszahlen bei der Durchschnittsbildung beteiligt sind
umso besser ist das Ergebnis normalverteilt. Die 12 scheint da irgendein
(mehr oder weniger begruendeter) Erfahrungswert zu sein.
Tschau,_
|_)
| \ainer
+---------------------------------------------------------------------------+
| Rainer Lux (l...@alf2.ngate.uni-regensburg.de) |
| Universitaet Regensburg, (Mathematik) |
+---------------------------------------------------------------------------+
>Hi,
>Ich suchen eine Routine (am besten in C/C++) zur Erzeugung von Normalverteilten
>Zufallszahlen. Weiss jemand da was ?
Da empfehle ich die Box-Muller-Methode:
Es seien A und B zwei im Intervall (0,1) gleichverteilte Zufallszahlen.
Dann ergeben sich "uber die Gleichungen:
Y=cos(2*pi*B)*sqrt(-2*ln(A))
X=sin(2*pi*B)*sqrt(-2*ln(A))
die beiden _von einander unabh"angigen_ (!) normalverteilten Zufallszahlen
X und Y. Merke: aus zwei gleichverteilten zwei normalverteilte Zufallszahlen.
Problem der Sache: cos, sin und ln sind (zumindest ohne Coproz.) sehr auf-
wendig.
Lit.(z.B.): Tadikamalla, P.R., 1984. Modelling and generating stochastic
inputs for simulation studies. Am. Journ. of Mathematical and Management
Sciences 4, 203-224.
Im genannten Journal-Band befinden sich noch weitere Algorithmen zur Gene-
rierung speziell verteilter Zufallszahlen, z.B. auch f"ur mehrdimensionale,
d.h. mit vorgegebener Korrelation.
Gru"s und beste Neujahrs-Gesundheits-W"unsche
Thomas
petz...@biowissenschaft.tu-dresden.d400.de
Bei der Polar-Methode, die eine von Marsaglia vorgeschlagene Modifizierung der Box-Muller-Methode ist, wird die Berechnung der Sinus- und Cosinus-Funktionen durch einen Verwerfungsprozess ersetzt :
(U_i, U_i+1) seien eine Folge unabhaengiger, zweidimensionaler Zufallsvariablen, wobei U_i, U_i+1 unabhaengige R(0,1)-verteilte Zufallsvariablen seien. Mit V_i= 2*U_i - 1 und V_i+1 = 2*U_i+1 - 1 sei N = min{j : V_j^2 + V_j+1^2 <= 1}. Dann gilt P(N < inf) = 1, E(N) = 4/pi und
X_N = V_N * sqrt( (-2*ln(V_N^2 + V_N+1^2)/(V_N^2 + V_N+1^2) )
X_N+1 = V_N+1 * sqrt( (-2*ln(V_N^2 + V_N+1^2)/(V_N^2 + V_N+1^2) )
sind unabhaengige N(0,1)-verteilte Zufallsvariablen.
Viele Gruesse,
Steffen.
--
*********************************************************