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 ?