Hi Rene,
interessante Frage, mal schauen.
Ich würde die Zahlen 1 bis 20 als eine Zahlengerade betrachten deren Abstände zwichen den Zahlen die prozentuale Gewichtung darstellt. Dann schaust du in welchem Bereich auf dieser Geraden du landest und nimmst die Zahl zu diesem Bereich als Resulat.
Also wenn man in Prozent rechnet dann würde die Summe der Gewichtungen der Zahlen von 1 bis 20 ja 100 ergeben. Wir ziehen nun mit Random(100) eine Zahl zwischen 0 bis 99 und schauen auf unsere Gewichtete Zahlengeraden in welchem Bereich wir liegen.
Das könnte so aussehen:
Delphi-Quellcode:
function RandomVerteilung(
const Verteilung:
array of Cardinal): Integer;
var
I,J: Integer;
begin
J := 0;
for I := Low(Verteilung)
to High(Verteilung)
do
Inc(J, Verteilung[I]);
J := Random(J);
I := Low(Verteilung);
while (J > 0)
and (I <= High(Verteilung))
do
begin
Dec(J, Verteilung[I]);
Inc(I);
end;
Result := I;
end;
Angenommen wir möchten aus die Zahlen 1 bis 5 mit folgenden Wahrscheinlichkeiten haben
1 = 10%
2 = 20%
3 = 40%
4 = 10%
5 = 20%
dann benutzen wir obige Funktion so
Result := RandomVerteilung([10,20,40,10,20]) +1;
Unsere Zahlengerade sähe so aus
1 -> 0 bis 9
2 -> 10 bis 29
3 -> 30 bis 69
4 -> 70 bis 79
5 -> 80 bis 99
Gruß Hagen