Einzelnen Beitrag anzeigen
  #19  
Alt 08.06.07, 00:57
Benutzerbild von richy
richy richy ist offline
Singularität
 
Registriert seit: 01.05.2007
Ort: karlsruhe
Beitr?ge: 4.170
Standard AW: Heraushalten bis in alle Ewigkeit

Weils so einfach ist :

VORBEREITUNG
***********
1) Speichere in a[1..N] die gewuenschte Dichte der N Zahlen 1,2,3 ...N

2) Normiere die Summe aller a[1..N] auf 1
d.h.
2a) Speichere zunaechst die Summe aller a[1..N] in p
2b) Teile alle a[1..N] durch p

3) Integriere die Funktion a[1..N] unbestimmt z.B numerisch und speichere dies
z.B wieder in a[1..N]. (Man benoetigt nur das Integral)
> for i from 2 to N do a[i]:=a[i]+a[i-1]; od;

EINE ZUFALLSZAHL ERZEUGEN
*******************
4) Erzeuge eine gleichverteilte Fliesskomma Zufallszahl s von 0 bis 1
> s:=rand( 0 (1)..1000)/1000; (Hier Aufloesung 1000. Ist beliebig aber > N)

5) Bilde eine Schleife j=1..N
Sobald s kleiner a[j] ist, dann ist j eine Zufallszahl, die der vorgegebenen Verteilung entspricht.
Springe dann einfach aus der Schleife

> for j from 1 to N do
> if s<=a[j] then break; fi;
> od;

break springt aus der Scheife an diese Stelle hier
Mit "while" gehts natuerlich auch
s war eine gleichverteilte Zufallszahl 0..1
In j steht nun eine Zufallszahl 1..N der gewuenschten Verteilung

Wiederhole den Vorgang beliebig oft :-)
(Getestet, aber Fehler nicht ausgechlossen)

Hier eine bischen umstaendlich beschriebene aehnliche Theorie dazu
http://de.wikipedia.org/wiki/Inversionsmethode

Weiss jemand warum man es sich in obigem Link so schwer macht ?

Ge?ndert von richy (08.06.07 um 06:02 Uhr)
Mit Zitat antworten