phpbar.de logo

Mailinglisten-Archive

[php] Nicht gleichverteiltes array_rand()

[php] Nicht gleichverteiltes array_rand()

Andreas Muck ml_(at)_chapulin.de
13 Nov 2000 15:00:56 +0100


"Jens Maukisch" <j.maukisch_(at)_designforweb.de> writes:

>Generier doch einfach eine Zufallszahl (die ist ja glaube ich
>0<= zufallszahl<=1, wenn nicht kann man die ja noch nen
>bisschen dividieren) und schau einfach ob der weri der dabei rauskommt
>kleiner als 1/6, 2/6 oder 3/6 ist...

Danke, so ähnlich habe ich es dann letzendlich auch gemacht...

>...und füg einfach noch nen wert in den array ein,

...obwohl ich nicht verstanden habe, was Du damit gemeint hast.

Ich habe mit einem Array in der Form

(
  "a" => 1,
  "b" => 2,
  "c" => 3,
  "d" => 2,
  "e" => 1
)

als "Wahrscheinlichkeitsdichte" angefangen und die Werte aufsummiert
um so eine "Wahrscheinlichkeitsverteilung" zu erreichen. Also das
Array wie folgt umgerechnet:

(
  "a" => 1,
  "b" => 3,  // = 1 + 2
  "c" => 6,  // = 3 + 3
  "d" => 8,  // = 6 + 2
  "e" => 9   // = 7 + 1
)

Ok, um echte Wahrscheinlichkeitswerte zu bekommen, müsste man noch auf
1 normieren, aber mit Integer finde ich es besser und ist vermutlich
auch einen Tick schneller.

Dann nur noch eine zufällige Schwelle erzeugt:

    mt_srand ((double) microtime() * 1000000);
    $schwelle = mt_rand (1, 9);

und die Schwelle im Array gesucht:

    reset ($array);
    foreach ($array as $key => $value) {
        if ($value >= $schwelle) {
            echo "$key";
            break;
        }
    }

Funktioniert soweit wunderbar!

Allerdings war mir das Umrechnen der Tabelle und Maximumsuche in PHP
zu langsam so daß ich die erste Tabelle als Textdatei abgelegt habe
und daraus die zweite Tabelle und den Maximalwert extern mit einem
Perl-Skript erzeuge und statisch im PHP-Skript einbinde.

Wenn man erste Tabelle noch nach absteigenden Wahrscheinlichkeiten
sortieren würde, wäre die foreach() Schleife auch besser optimiert, da
die wahrscheinlicheren Werte am Anfang wären.

Wenn jemand einen besseren Vorschlag hat, immer her damit :)

Gruß,
Andreas


php::bar PHP Wiki   -   Listenarchive