2012-06-26 6 views
5

Lassen Sie uns erklären, was ich meine.Ist rand() zeitabhängig in PHP?

Vor einiger Zeit, während ein Programm in C# zu schreiben, habe ich gemacht folgende Fehler:

int Randomize() 
{ 
    Random r=new Random(); 
    return r.Next(0,10); 
} 

in C#

, das ist ein Fehler, denn mehrmals in einer Reihe genannt, wird diese Funktion zurückkehrt der gleiche Wert. Das liegt daran, dass der Zufallskonstruktor Zeitsaat verwendet und der Zeitunterschied zwischen den Anrufen zu niedrig war (ich brauchte eine Stunde, um das zu finden :)).

Jetzt verwende ich rand(...) in PHP, und ich brauche für die Ausgabe immer anders zu sein, auch wenn 2 Skripte zur gleichen Zeit ausgeführt werden.

Muss ich etwas tun, um dieses Ergebnis zu erhalten, oder soll es so funktionieren?

+0

Lassen Sie es funktioniert, obwohl mt_rand() ist besser als rand() –

+0

Gute Frage.Ich kann es nicht spezifisch im Detail beantworten, aber der akzeptierte PRNG der Wahl ist heutzutage "mt_rand", nicht "rand". – deceze

+0

Gute, aber ich denke in Ihrem Fall ist es schwierig, die Ausgabe zu unterschiedlich sein, auch wenn zwei Skripte zur gleichen Zeit ausgeführt werden –

Antwort

9

die rand() und auch mt_rand() Anrufe srand() und mt_srand() immer zufällige Ergebnisse. Aber hier ist ein interessanter Beitrag auf php.net:

Beachten Sie, dass die automatische Impfen mit der aktuellen Anzahl von Sekunden geschehen zu sein scheint, das bedeutet, dass Sie die gleichen Ergebnisse für mehr läuft auf einem schnellen Server erhalten können. Entweder rufen Sie srand() selbst mit einem mehr häufig ändern Samen oder verwenden Sie mt_rand(), die nicht zu erscheinen, leiden unter dem Problem.

Also, rufen Sie einfach srand häufiger oder mt_rand.

+1

obwohl nicht php, aber immer noch eine gute lesen für warum automatische Seeding vielleicht nicht der beste Ansatz ist. http://baagoe.com/de/RandomMusings/javascript/ – Yoshi

3

über mt_rand() Funktion ...

Von http://php.net/manual/en/function.mt-srand.php

Ab PHP 4.2.0 gibt es keine Notwendigkeit, den Zufallszahlengenerator mit srand() oder mt_srand() zu impfen, da dies jetzt automatisch erledigt.

(Für PHP 5.2.1) Die Mersenne Twister-Implementierung in PHP verwendet jetzt einen neuen Seeding-Algorithmus von Richard Wagner. Identische Seeds erzeugen nicht mehr die gleiche Abfolge von Werten wie in früheren Versionen. Es ist nicht zu erwarten, dass sich dieses Verhalten erneut ändert, aber es gilt als unsicher, sich dennoch darauf zu verlassen.

Hier ist link, mit Beschreibung des "Mersenne-Twister (MT)" Pseudo-Zufallszahl-Erzeugungsalgorithmus (und implementations in C, C++, C#)

Here Sie Implementierung dieser Funktion finden in PHP 5

Und in php_rand.h fand ich dies:

#ifdef PHP_WIN32 
#define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId()))^((long) (1000000.0 * php_combined_lcg(TSRMLS_C)))) 
#else 
#define GENERATE_SEED() (((long) (time(0) * getpid()))^((long) (1000000.0 * php_combined_lcg(TSRMLS_C)))) 
#endif 

So jetzt können Sie sehen, dass zufällige Funktionen in PHP auf time Funktion ...

+0

Überprüfen Sie auch 'lcg.c'. Es hängt von der Zeit ** einmal ** ab, wenn es nicht bereits gesetzt ist. Per Definition erzeugt die LCG nach jedem Aufruf einen neuen Zufallswert und hängt nicht von der Zeitfunktion für jeden Aufruf ab. – Leigh

+0

@Leh, in der Tat. Ich habe diesen Punkt verpasst. Vielen Dank. –