numero - Mejor generador aleatorio de PHP
generar numero aleatorio de 4 digitos php (6)
Sé que solo usar rand()
es predecible, si sabes lo que estás haciendo y tienes acceso al servidor.
Tengo un proyecto que depende mucho de elegir un número aleatorio que sea lo más impredecible posible. Así que estoy buscando sugerencias, ya sea otras funciones incorporadas o funciones de usuario, que puedan generar un mejor número aleatorio.
Lo usé para hacer una pequeña prueba:
$i = 0;
while($i < 10000){
$rand = rand(0, 100);
if(!isset($array[$rand])){
$array[$rand] = 1;
} else {
$array[$rand]++;
}
sort($array);
$i++;
}
Encontré que los resultados se distribuyeron de manera uniforme, y hay un patrón extraño en la cantidad de veces que se genera cada número.
¿Variación en @KG, usando los milisegundos desde EPOCH como semilla para rand?
Agregar, multiplicar o truncar una fuente aleatoria pobre le dará un resultado aleatorio pobre. Ver Introducción a la Aleatoriedad y los Números Aleatorios para una explicación.
Tienes razón sobre la función PHP rand (). Vea la segunda figura en el Análisis estadístico para una ilustración llamativa. (La primera figura es sorprendente, pero ha sido dibujada por Scott Adams, no graficada con rand ()).
Una solución es usar un verdadero generador aleatorio como random.org . Otro, si estás en Linux / BSD / etc. es usar / dev / random . Si la aleatoriedad es crítica para la misión, deberá usar un generador aleatorio de hardware .
Sería cauteloso con la impresión de aleatoriedad: ha habido muchos experimentos en los que la gente elegiría la distribución menos aleatoria. Parece que la mente no es muy buena para producir o estimar la aleatoriedad.
Hay buenos artículos sobre aleatoriedad en Fourmilab , incluido otro verdadero generador aleatorio . Tal vez podrías obtener datos aleatorios de ambos sitios, así que si uno está abajo, todavía tienes el otro.
Fourmilab también proporciona un programa de prueba para verificar la aleatoriedad. Puede usarlo para verificar sus diversos programas myRand ().
En cuanto a su último programa, si genera 10000 valores, ¿por qué no elige el valor final entre los 10 mil? Usted se restringe a un subconjunto. Además, no funcionará si tus $ min y $ max son superiores a 10000.
De todos modos, la aleatoriedad que necesita depende de su aplicación. rand () estará bien para un juego en línea, pero no está bien para la criptografía (de todos modos, cualquier cosa que no haya sido probada exhaustivamente con programas estadísticos no será adecuada para la criptografía). ¡Tú eres el juez!
Otra forma de obtener números aleatorios, similar en concepto a obtener UUID
Versión PHP 5.3 y superior
openssl_random_pseudo_bytes(...)
O puede probar la siguiente biblioteca usando RFC4122
random.org tiene una API a la que puedes acceder a través de HTTP.
RANDOM.ORG es un verdadero servicio de números aleatorios que genera aleatoriedad a través del ruido atmosférico.
Un nuevo PHP7 tiene una función que hace exactamente lo que usted necesita: genera enteros pseudoaleatorios criptográficamente seguros.
int random_int ( int $min , int $max )
Genera enteros aleatorios criptográficos que son adecuados para el uso donde los resultados imparciales son críticos (es decir, barajar un mazo de Poker).
Para obtener una explicación más detallada acerca de PRNG y CSPRNG (y su diferencia), así como por qué su enfoque original es en realidad una mala idea, lea mi otra respuesta muy similar .