2008-08-08 37 views
17

Sé que solo usando rand() es predecible, si sabe lo que está haciendo y tiene acceso al servidor.Mejor generador aleatorio PHP

Tengo un proyecto que es altamente dependiendo 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.

I utilizado esto 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++; 
} 

I conocer los resultados que se distribuyen uniformemente, y no hay un patrón extraño para el número de veces que se genera cada número.

+0

Hay una nueva función en php7, que [hace exactamente lo que necesita] (http://stackoverflow.com/a/31444887/1090562). –

Respuesta

21

Agregar, multiplicar o truncar una fuente aleatoria pobre le dará un resultado aleatorio pobre. Ver Introduction to Randomness and Random Numbers para una explicación.

Tiene razón acerca de la función PHP rand(). Vea la segunda figura en Statistical Analysis 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 utilizar 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 hardware random generator.

3

Variación en @KG, usando los milisegundos desde EPOCH como semilla para rand?

+0

Sooooo, con las rápidas computadoras multi-core actuales, ¿tiene muchas posibilidades de volver a utilizar la semilla varias veces? Bandera roja Humongous: estás reinventando una rueda cuadrada, incluso 'srand()' sin argumentos tiene un trabajo mejor ("más aleatorio"). – Piskvor

5

random.org tiene una API a la que puede 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.

4

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 true random generator. 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 test program 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 sus $ min y $ max son mayores que 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!

2

Otra forma de obtener números aleatorios, similar en concepto a conseguir UUID

PHP versión 5.3 y por encima de

openssl_random_pseudo_bytes(...) 

O puede probar el siguiente library utilizando RFC4122

1

Un nuevo PHP7 hay una función que hace exactamente lo que necesitaba: genera cryptographically secure pseudo-random integers.

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 una explicación más detallada sobre PRNG y CSPRNG (y su diferencia), así como por las que su enfoque original es en realidad una mala idea, por favor leer mi another highly similar answer.

Cuestiones relacionadas