Zufallszahlen
Stefan G.
- php
Hallo zusammen,
ich habe nachgelesen, dass Zufallszahlen in PHP am besten mit den
Funktionen mt_rand und mt_srand erzeugt werden. Im konkreten Fall habe
ich mehrere Funktionen, in denen sowas wie ein Würfelwurf simuliert
werden soll.
Um gute Zufallszahlen zu erhalten, ist es laut Literatur ratsam, die
folgende Zeile vor der Verwendung der Funktion mt_rand einzufügen:
mt_srand((double)microtime()*1000000);
Nun meine Frage, wenn ich die Funktion mt_rand in mehreren verschiedenen
Funktionen verwende, an welchen Stellen muss ich dann die Funktion
mt_srand aufrufen? Zu Beginn und innerhalb der jeweiligen Funktion oder
nur einmal am Beginn des Skripts, in dem die Funktionen aufgerufen
werden? Wie sieht die geschickteste Vorgehensweise aus?
Viele Grüße
Stefan
Nun meine Frage, wenn ich die Funktion mt_rand in mehreren verschiedenen
Funktionen verwende, an welchen Stellen muss ich dann die Funktion
mt_srand aufrufen?
Einmal pro Programm (in diesem Fall: Skript) reicht völlig aus. Erst bei Programmen, die über Stunden oder Tage laufen, lohnt sich die Überlegung eines Neustarts des Zufallsgenerators per seed.
Zufallsgeneratoren erzeugen von keine tatsächlich zufälligen Zahlen, sondern lediglich berechnete Zahlenreihen, die möglichst viele Eigenschaften von echten zufälligen Zahlenreihen besitzen.
Diese berechneten Zahlenreihen beginnen also zwangsläufig an einem bestimmten Startwert, dem ebenso zwangsläufig vorhersehbare Zahlen folgen. Damit nun nicht jedesmal die gleiche Zahlenreihe erscheint, wird ein solcher Zufallsgenerator mit einem halbwegs zufälligen Startwert initiiert. Dazu dient die "seed"-Funktion. Die "rand"-Funktion liefert darauf basierend die entsprechende Zahlenreihe.
Zu häufiger Einsatz von seed kann übrigens das Ergebnis eher verschlechtern (zumindest theoretisch), je nachdem, woher man den Startwert bekommt.
Die Zeit beispielsweise kann als einzelner Punkt zwar durchaus recht zufällig sein, benutzt man aber mehrere Zeitpunkte, läuft man schon Gefahr, eine Regelmäßigkeit zu bekommen - schlicht und ergreifend dadurch, daß ein Programm von seed A bis zu seed B immer die exakt gleiche Zeitdauer benötigt.
Diese Überlegung ist aber wie gesagt nur rein theoretisch und für die Praxis sicher in den allermeisten Fällen unbedeutend.
Gruß,
soenk.e
Hallo Soenke,
vielen Dank für die ausführliche Antwort!
Gruß, Stefan