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