mt_srand funktionen übergreifend?
AllesMeins
- php
Hiho,
eine kleine Frage: Ist mt_srand() funktionenübergreifend, sprich reicht es wenn ich es oben in das Hauptscript einbaue oder muss der Kram in jede Funktion mit rein?
Grüsse
Marc
Halihallo AllesMeins
eine kleine Frage: Ist mt_srand() funktionenübergreifend, sprich reicht es wenn ich es oben in das Hauptscript einbaue oder muss der Kram in jede Funktion mit rein?
(mt_|)srand() ist funktionsübergreifend. Es muss (ja sogar: sollte)
nur einmal am Script-Start aufgerufen werden. Alles andere ist reine
Performanceverschwendung und wird bei (sehr) alten PHP-Versionen
sogar zur Vernichtung jedwelchem "Zufälligkeitscharakters" führen,
falls der Random-Seed mit einem nicht wechselnden Integer (wie des
öfteren mal time(), falls das Script nicht länger als 1s für dessen
Terminierung braucht) initiiert wird.
Neuere Versionen von PHP schliessen erneutes aufrufen von srand()
grundsätzlich aus (eben weil es falsch ist!) und seit PHP 4.2.0
braucht man srand() gar nicht erst aufzurufen, denn dies geschieht
automatisch.
Fazit: PHP<4.2.0 => (mt_|)srand() nur am Anfang und einmalig im
Script.
PHP>=4.2.0 => gar nicht mehr aufrufen.
Viele Grüsse
Philipp
Halihallo AllesMeins
eine kleine Frage: Ist mt_srand() funktionenübergreifend, sprich reicht es wenn ich es oben in das Hauptscript einbaue oder muss der Kram in jede Funktion mit rein?
Hui, ich irrte mich, srand() wird nicht nur einmal ausgeführt und
siehe da, futsch ist die Pseudozufälligkeit: (ich dachte, dass dies
in neueren PHP-Versionen eben unterbunden wird...)
<?
function outputRandom() {
mt_srand(time());
echo(mt_rand() . ' ');
}
for ( $i=0; $i<1000; $i++ ) { outputRandom(); }
?>
// geht auch mit srand() und rand()
Also: Lass das Aufrufen von srand() in Funktionen mal lieber, es
sei denn, du willst immer die gleiche Zufallszahl :-)
Viele Grüsse
Philipp
Hiho,
alles klar - danke für die ausführliche Antwort.
Marc