[PHP] andere lösung für eine % chance

Showmaker

Erfahrener Benutze
29 April 2006
250
14
Hallo zusammen,

ich habe Befehle eine der 4 Befehle soll ausgelöst werden.
Jeder der 4 Befehle soll eine % Chance haben.
Mir fällt nur eine lösen ein aber es gibt bestimmt eine bessere Idee.
Da ich glaube das meine Idee zu Server intensiv ist!?
Wenn einer von euch ne Idee hat währe ich sehr dankbar.
Danke schon mal

PHP:
$zahl = zufall(1,100)
$pro1 = $row['pro1'];  // 1 steht in der $pro1
$pro2 = $pro1+$row['pro2']; //10 steht in der $pro2
$pro3 = $pro2+$row['pro3']; //90 steht in der $pro3
$pro4 = $pro3+$row['pro4']; //100 steht in der $pro4
 
if($zahl<=$pro1) // 1% Changse
{
 if($zahl<=$pro2) // 9% Changse
 {
  if($zahl<=$pro3) // 80% Changse
  {
   if($zahl<=$pro4) // 10% Changse
   { 
.....
 
Du siehst selber, dass du denselben Code mehrmals stehen hast. Hier kannst du also mittels eines Array optimieren.

Den Server stört das vermutlich nicht, aber denjenigen, die deinen Code später mal warten müssen.
 
Nebenbei, der Code oben, so wie er jetzt da steht, hat ein dicken logischen Fehler.

Du hast folgende Werte:
pro1 = 1% -> $pro1 = 1
pro2 = 9% -> $pro2 = 10
pro3 = 80% -> $pro3 = 90
pro4 = 10% -> $pro4 = 100

Die Abfrage if($zahl<=$pro1) // 1% Chance { ... würde nur in 1 von 100 Fällen den Block einleiten, und dann auch ganz bis zum Ende, da wenn 1<=1 ist, auch immer 1<=10, 1<=90 und 1<=100 ist. In den restlichen 99 Fällen kommt PHP gar nicht hin bis if($zahl<=$pro2) // 9% Chance.

Ich würde es so lösen:
PHP:
<?php
$pro1 = 1; //Zahl 1 mit Wahrscheinlichkeit 1%
$pro2 = 9; //Zahl 2 mit Wahrscheinlichkeit 9%
$pro3 = 80; //Zahl 3 mit Wahrscheinlichkeit 80%
$pro4 = 10; //Zahl 4 mit Wahrscheinlichkeit 10%
$text = str_repeat(1, $pro1) . str_repeat(2, $pro2) .
	str_repeat(3, $pro3) . str_repeat(4, $pro4);
$zahl = $text[rand(0, strlen($text)-1)];
echo $zahl; //gibt 1, 2, 3 oder 4 aus
?>
 
Ich würde es so lösen
ziemlich unnötig hoher Speicherverbrauch bei hoher Wahrscheinlichkeitseinstufung (Nachkommabereich).

Meine Lösung sieht so aus:
PHP:
$wert 1 = 11; // 1.1%
$wert2 = 399; // 39.9%
$wert3 = 500; // 50%
$wer4 = 90; // 9%

$rnd = mt_rand(1, 1000); // 0.1% - 100%

$ac = 0; // Akkumulator
if(($ac+=$wert1) >= $rnd) doSth1();
else if(($ac+=$wert2) >= $rnd) doSth2();
else if(($ac+=$wert3) >= $rnd) doSth3();
else if(($ac+=$wert4) >= $rnd) doSth4();
else die('Programmierfehler xD');