Haben wir hier ein Problem mit der Definition von
gleichverteilt?
Gleichverteilt bedeutet schlicht, dass alle Werte gleich häufig sind. [falls sie voneinander abhängig sind]
D.h. Casino 49%/1%/50% ist nicht gleichverteilt. 25%/25%/25%/25% ist gleichverteilt.
Auch wenn Wahrscheinlichkeiten voneinander abhängig sind, ist es wieder nicht gleichverteilt:
wenn rand(1, 10) == 1 ...
sonst, wenn rand(1, 10) == 1 ...
In dem Fall haben wir wieder keine Gleichverteilung, sondern Wahrscheinlichkeiten von 10% und (10% * (100% - 10%)) = 9%, was eine kleine, aber eindeutige Differenz ist. [Und was ist mit dem Fall wo nichts passiert… da sind noch 81% … ]
Und sowas gab es schon lange davor in Freewar.
Mehrmaliges würfeln (aka min-max-rand) für einen bestimmten Wert gibt es vielleicht erst seit sgr/ava, aber ungleich verteilte Ereignisse gibt es schon sehr lange in Freewar.
Oder bspw. ceil(log(rand(1, 1000), 10)) … sowas gibt es auch schon länger. Die Werte sind aber dabei sehr ungleich verteilt... 0: 0.1% 1: 0.9% 2: 9% 3: 90%.
Gleichverteilung bezieht sich auf etwas bestimmtes. rand() ist (fast … PRNG, jojo) gleichverteilt. Min-max-rand basiert immer noch auf einer gleichverteilten Funktion: rand(). Das Ergebnis jedoch ist ungleich verteilt. min-max-rand ist nichts anderes als:
Code: Alles auswählen
function min_max_rand($a, $b, $num) { // O(1) version
return $b - ceil(rand(1, ($b - $a + 1) ** $num) ** (1 / $num)) - 1;
}
$val = min_max_rand(1, 3, 2 /* zwei mal würfeln */);
// oder
$r = rand(1, 9);
if ($r <= 1) $val = 3;
elseif ($r <= 4) $val = 2;
elseif ($r <= 9) $val = 1;
Aber schlussendlich, fragt doch einfach Sotrax.