Pseudorandom number generators (PRNG) son bestia muy complejo.
No hay verdaderos generadores de números aleatorios "perfectos"; de hecho, lo mejor que se puede hacer de las funciones matemáticas son pseudoaleatorias: parecen lo suficientemente aleatorias para la mayoría de los propósitos.
De hecho, realizar acciones adicionales a partir de un número devuelto por un PRNG realmente no aumenta su aleatoriedad, y de hecho, el número puede ser menos aleatorio.
Por lo tanto, mi mejor consejo es, no perder el tiempo con los valores devueltos por un PRNG. Use un PRNG que sea lo suficientemente bueno para el uso previsto, y si no lo es, busque un PRNG que pueda producir mejores resultados, si es necesario.
Y francamente, parece que la función mt_rand
usa el Mersenne twister, que es un PRNG bastante bueno, por lo que probablemente sea lo suficientemente bueno para el uso más casual.
Sin embargo, Mersenne Twister no está diseñado para usarse en ningún contexto de seguridad. Consulte this answer para obtener una solución para usar cuando necesite aleatoriedad para garantizar la seguridad.
Editar
Hubo una pregunta en los comentarios qué realizar operaciones en un número aleatorio puede hacer que sea menos aleatorio. Por ejemplo, algunos PRNG pueden devolver números más consistentes y menos aleatorios en diferentes partes de los bits: el extremo superior puede ser más aleatorio que el extremo inferior.
Por lo tanto, en operaciones en las que la gama alta se descarta y se devuelve el extremo inferior, el valor puede ser menos aleatoria que el valor original de regresar de la PRNG.
No encuentro una buena explicación por el momento, pero la he basado en la documentación de Java para el método Random.nextInt(int)
, que está diseñado para crear un valor bastante aleatorio en un rango específico. Ese método tiene en cuenta la diferencia en la aleatoriedad de las partes del valor, por lo que puede devolver un número aleatorio mejor en comparación con implementaciones más ingenuas como rand() % range
.
Este es un duplicado de una de mis preguntas http://stackoverflow.com/questions/5611/better-random-generating-php – UnkwnTech
La versión más reciente de php tiene un [PRNG criptográficamente seguro] (http: // stackoverflow. com/a/31443898/1090562). –
Si alguien está leyendo esto, omita la respuesta aceptada porque [esta respuesta es la correcta] (http://stackoverflow.com/a/31443898/2224584). Si está atascado en PHP 5, consulte [random_compat] (https://github.com/paragonie/random_compat). –