2012-06-26 20 views
5

Vamos a explicar a qué me refiero.¿Rand() depende del tiempo en php?

Hace algún tiempo, al escribir un programa en C#, he hecho siguiente error:

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

en C#, esto es un error, porque, llamado varias veces seguidas, esta función devolverá el mismo valor Esto se debe a que el constructor Random usa el tiempo de inicialización, y la diferencia de tiempo entre las llamadas era demasiado baja (me tomó una hora encontrar esa :)).

Ahora estoy usando rand(...) en php, y necesito que la salida sea siempre diferente, incluso si se ejecutan 2 scripts al mismo tiempo.

¿Tengo que hacer algo para obtener este resultado, o está diseñado para funcionar de esta manera?

+0

Solo déjalo funcionar, aunque mt_rand() es mejor que rand() –

+0

Buena pregunta.No puedo responderlo específicamente en detalle, pero el PRNG aceptado de estos días es 'mt_rand', no' rand'. – deceze

+0

Bueno, pero creo que en su caso es difícil asegurar que la salida sea diferente, incluso si se ejecutan dos scripts al mismo tiempo –

Respuesta

9

rand() y también mt_rand() llamadas srand() y mt_srand() para producir resultados siempre aleatorios. Pero aquí es un interesante puesto en php.net:

Nótese que la siembra automática parece estar hecho con la corriente número de segundos, lo que significa que puede obtener los mismos resultados para varios se ejecuta en un servidor rápido. O bien llame a srand() usted mismo con un semilla que cambia frecuentemente o use mt_rand() que no parece sufrir el problema.

Por lo tanto, simplemente llame al srand con más frecuencia o al mt_rand.

+1

aunque no php, pero sigue siendo una buena lectura de por qué la creación de semillas automática no es el mejor enfoque. http://baagoe.com/en/RandomMusings/javascript/ – Yoshi

3

Sobre mt_rand() función ...

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

A partir de PHP 4.2.0, no es necesario inicializar el generador de números aleatorios con srand() o mt_srand(), ya que es ahora hecho automáticamente.

(para PHP 5.2.1) La implementación de Mersenne Twister en PHP ahora usa un nuevo algoritmo de siembra de Richard Wagner. Las semillas idénticas ya no producen la misma secuencia de valores que tenían en versiones anteriores. No se espera que este comportamiento vuelva a cambiar, pero se considera inseguro contar con él de todos modos.

Aquí es link, la descripción de la "Mersenne Twister (MT)" número pseudoaleatorio algoritmo de generación (y implementations en C, C++, C#)

Here puede encontrar aplicación de esta función en PHP 5

Y en php_rand.h encontré esto:

#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 

Así que ahora puedes ver que las funciones aleatorias en PHP se basan en la función time ...

+0

También echa un vistazo a 'lcg.c'. Depende del tiempo ** una vez ** si ya no está sembrado. Por definición, el lcg producirá un nuevo valor aleatorio después de cada llamada, y no depende de la función de tiempo para cada llamada. – Leigh

+0

@Leigh, de hecho. Me perdí ese punto. Gracias. –