2012-06-26 20 views
5

Pozwól nam wyjaśnić, co mam na myśli.Czy funkcja rand() jest zależna od czasu w php?

Jakiś czas temu, pisząc program w C#, zrobiłem następujący błąd:

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

w C#, to pomyłka, bo nazywa się kilka razy z rzędu, to funkcja zwróci ta sama wartość. Dzieje się tak dlatego, że konstruktor losowy używa nasienia czasu, a różnica czasu między połączeniami była zbyt niska (zajęło mi to godzinę, aby to znaleźć :)).

Teraz używam rand(...) w php i potrzebuję, aby wyjście zawsze było inne, nawet jeśli 2 skrypty są wykonywane w tym samym czasie.

Czy muszę coś zrobić, aby uzyskać ten wynik, lub czy jest przeznaczony do pracy w ten sposób?

+0

Po prostu pozwól działać, chociaż mt_rand() jest lepszy niż rand() –

+0

Dobre pytanie.Nie mogę szczegółowo odpowiedzieć na to pytanie, ale obecnie akceptowanym PRNG jest 'mt_rand', a nie' rand'. – deceze

+0

Dobrze, ale myślę, że w twoim przypadku trudno jest zapewnić, że dane wyjściowe będą różne, nawet jeśli dwa skrypty zostaną wykonane w tym samym czasie. –

Odpowiedz

9

the rand(), a także mt_rand() dzwoni srand() i mt_srand(), aby uzyskać zawsze losowe wyniki. Ale oto ciekawy post na php.net:

Funkcja automatycznego siew wydaje się być zrobione z obecnym liczbę sekund, co oznacza, że ​​można uzyskać takie same wyniki dla kilku działa na szybkim serwerze. Albo wywołaj srand() samemu z większą liczbą zmiennych nasienia lub użyj mt_rand(), która nie wydaje się być cierpiąca na problem.

Tak, po prostu zadzwoń srand częściej lub mt_rand.

+1

choć nie php, ale nadal dobrze czytać, dlaczego automatyczne rozsiewanie może nie jest najlepszym rozwiązaniem. http://baagoe.com/en/RandomMusings/javascript/ – Yoshi

3

O mt_rand() funkcja ...

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

Od PHP 4.2.0, nie ma potrzeby do materiału siewnego generator liczb losowych z srand() lub mt_srand(), jak to jest teraz zrobione automatycznie.

(Dla PHP 5.2.1) Implementacja Mersenne Twister w PHP teraz wykorzystuje nowy algorytm wysiewu autorstwa Richarda Wagnera. Identyczne nasiona nie wytwarzają już takiej samej sekwencji wartości, jaką wykonały w poprzednich wersjach. Takie zachowanie nie powinno się zmieniać, ale mimo to uważa się, że jest to niebezpieczne.

Oto link, z opisem "Mersenne Twister (MT)" numer pseudolosowych generowania algorytm (i implementations w C, C++, C#)

Here można znaleźć realizację tej funkcji w PHP 5

I php_rand.h Znalazłem to:

#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 

Teraz widać, że funkcje losowe w PHP polegają na funkcji time ...

+0

Sprawdź także 'lcg.c'. To zależy od czasu ** raz **, jeśli nie jest już zaszczepiony. Z definicji lcg po każdej rozmowie generuje nową losową wartość i nie zależy od funkcji czasu dla każdego połączenia. – Leigh

+0

@Leigh, rzeczywiście. Tęskniłem za tym punktem. Dziękuję Ci. –

Powiązane problemy