repetir rand numero number mt_rand generar digitos cadena array aleatorio aleatoria php random

numero - php random string



¿Es rand() dependiente del tiempo en php? (2)

Vamos a explicar a qué me refiero.

Hace algún tiempo, mientras escribía un programa en c #, cometí el siguiente error:

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

en c #, esto es un error, porque, llamada 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?


Acerca de la función mt_rand() ...

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

A partir de PHP 4.2.0, no hay necesidad de inicializar el generador de números aleatorios con srand () o mt_srand () ya que esto se realiza 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í está el enlace , con la descripción del algoritmo generador de números pseudoaleatorios " Mersenne Twister (MT) " (y las implementaciones en C, C ++, C #)

Aquí puede encontrar la implementació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

Ahora puede ver que las funciones aleatorias en PHP dependen de la función de time ...


el rand() y también mt_rand() llama a srand() y mt_srand() para producir resultados siempre aleatorios. Pero aquí hay una publicación interesante en php.net:

Tenga en cuenta que el siembra automática parece estar hecho con la cantidad actual de segundos, lo que significa que puede obtener los mismos resultados para varias ejecuciones en un servidor rápido. O llame a srand () usted mismo con una semilla que cambia con mayor frecuencia o use mt_rand () que no parece sufrir el problema.

Entonces, solo llame a srand más frecuencia o mt_rand .