2012-06-26 16 views
5

Lasciamo spiegare cosa intendo.È rand() dipendente dal tempo in php?

Qualche tempo fa, durante la scrittura di un programma in C#, ho fatto seguente errore:

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

in C#, questo è un errore, perché, chiamato diverse volte di fila, questa funzione restituisce lo stesso valore. Ciò è dovuto al fatto che il costruttore casuale utilizza il seed temporale e la differenza di fuso orario tra le chiamate era troppo bassa (mi ci è voluta un'ora per trovarne uno :)).

Ora sto utilizzando rand(...) in php e ho bisogno che l'output sia sempre diverso, anche se 2 script vengono eseguiti contemporaneamente.

Devo fare qualcosa per ottenere questo risultato, o è progettato per funzionare in questo modo?

+0

Lasciatelo funzionare, anche se mt_rand() è meglio di rand() –

+0

Buona domanda.Non posso rispondere specificamente nei dettagli, ma il PRNG accettato di questi tempi è 'mt_rand', non' rand'. – deceze

+0

Buono, ma penso che nel tuo caso sia difficile garantire che l'output sia diverso, anche se due script vengono eseguiti allo stesso tempo. –

risposta

9

il rand() e anche mt_rand() chiamate srand() e mt_srand() per produrre risultati sempre casuali. Ma ecco un post interessante su php.net:

Si noti che la semina automatica sembra essere fatto con l'attuale numero di secondi che significa che è possibile ottenere gli stessi risultati per diversi viene eseguito su un server veloce. Chiamate srand() con un altro spesso cambiando seme o usate mt_rand() che non appare a soffre del problema.

Quindi, basta chiamare srand più frequentemente o mt_rand.

+1

sebbene non sia php, ma comunque una buona lettura del motivo per cui la semina automatica potrebbe non essere l'approccio migliore. http://baagoe.com/en/RandomMusings/javascript/ – Yoshi

3

Chi mt_rand() funzione ...

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

partire da PHP 4.2.0, non v'è alcuna necessità di inizializzare il generatore di numeri casuali con srand() o mt_srand() in quanto questo è ora fatto automaticamente.

(per PHP 5.2.1) L'implementazione di Mersenne Twister in PHP ora utilizza un nuovo algoritmo di seeding di Richard Wagner. I semi identici non producono più la stessa sequenza di valori che avevano nelle versioni precedenti. Questo comportamento non dovrebbe cambiare di nuovo, ma è considerato pericoloso affidarsi comunque a questo.

Ecco link, con la descrizione del "Mersenne Twister (MT)" numeri pseudo algoritmo di generazione (e implementations in C, C++, C#)

Here potete trovare implementazione di questa funzione in PHP 5

E in php_rand.h ho trovato questo:

#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 

Quindi ora puoi vedere che le funzioni casuali in PHP si basano sulla funzione time ...

+0

Controlla anche 'lcg.c'. Dipende dal tempo ** una volta ** se non è già stato seminato. Per definizione, lcg produrrà un nuovo valore casuale dopo ogni chiamata e non dipende dalla funzione orario per ogni chiamata. – Leigh

+0

@Leigh, davvero. Ho perso quel punto. Grazie. –

Problemi correlati