Mailinglisten-Archive |
"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