Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zufallsgenerator fuer Normalverteilte Zufallszahlen

407 views
Skip to first unread message

Carsten Krebs

unread,
Jan 3, 1994, 8:26:46 AM1/3/94
to
Hi,

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

Christian Burger

unread,
Jan 3, 1994, 10:49:10 AM1/3/94
to
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...

-=-----
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)

Ralf Muschall

unread,
Jan 3, 1994, 5:17:13 PM1/3/94
to
In article <2g9epm$2...@surz03.HRZ.Uni-Marburg.DE> bur...@papin.HRZ.Uni-Marburg.DE (Christian Burger) writes:
>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...
>

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

Daniel Roedding

unread,
Jan 3, 1994, 8:33:52 PM1/3/94
to
bur...@papin.HRZ.Uni-Marburg.DE (Christian Burger) schreibt:

>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)

Christian Burger

unread,
Jan 4, 1994, 3:11:42 AM1/4/94
to
Daniel Roedding (dan...@fiction.ms.sub.org) wrote:
: bur...@papin.HRZ.Uni-Marburg.DE (Christian Burger) schreibt:

: >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.

Rainer Lux

unread,
Jan 4, 1994, 3:41:05 AM1/4/94
to
>>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 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) |
+---------------------------------------------------------------------------+

Thomas Petzoldt Hydrobiologie

unread,
Jan 4, 1994, 6:24:41 AM1/4/94
to
ca...@cs.tu-berlin.de (Carsten Krebs) writes:

>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


Prof. Dr. Klaus Pommerening

unread,
Jan 5, 1994, 8:29:59 AM1/5/94
to
In article <2gb8bu$j...@surz03.HRZ.Uni-Marburg.DE>
bur...@papin.HRZ.Uni-Marburg.DE (Christian Burger) writes:
>
> 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.
>
Aber Vorsicht. Die ueblichen Zufallsgeneratoren (nach der Methode der
linearen Kongruenzen) erzeugen Folgen, deren 12-dimensionale Verteilung
miserabel ist. Folgerung: Die genannte Methode zur Erzeugung
normalverteilter Zufallszahlen ist nur bescheidene Ansprueche geeignet.
Besser ist die hier auch schon genannte Box-Muller-Methode. Wer alles ganz
genau wissen will: D.E.Knuth, The Art of Computer Programming, Vol.2
(Seminumerical Algorithms), Addison-Wesley.
--
Klaus Pommerening
Institut fuer Medizinische Statistik und Dokumentation
der Johannes-Gutenberg-Universitaet
D-55101 Mainz, Germany

W. Alex

unread,
Jan 5, 1994, 3:45:24 PM1/5/94
to
Prof. Dr. Klaus Pommerening (p...@katrin.imsd.uni-mainz.de) wrote:
: In article <2gb8bu$j...@surz03.HRZ.Uni-Marburg.DE>
: bur...@papin.HRZ.Uni-Marburg.DE (Christian Burger) writes:
: >
Im Rechenzentrum der Uni Karlsruhe sitzt ein netter Mensch namens
Hennecke, der hat die gaengigsten Algorithmen zur Erzeugung von
Pseudo-Zufallszahlen in C gegossen. Ich bin im Moment zu Hause, habe
keine Unterlagen hier. Gruss, W. Alex

Steffen Jakob

unread,
Jan 10, 1994, 3:45:36 AM1/10/94
to
In article <petzoldt.757682681@TUDURZ>, petz...@TUDURZ.urz.tu-dresden.de (Thomas Petzoldt Hydrobiologie) writes:
> ca...@cs.tu-berlin.de (Carsten Krebs) writes:
>
> >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:

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.
--
*********************************************************

0 new messages