¿Cuál es la desventaja de mt_rand?

¿Cuál es la definición de sesgo en:

La distribución de los valores de retorno mt_rand () está sesgada hacia los números pares en las comstackciones de PHP de 64 bits cuando max está más allá de 2 ^ 32.

Si es el tipo de prejuicio establecido en las reglas alternativas de desempate para el redondeo , no creo que realmente importe (ya que el sesgo no es realmente visible).

Además de mt_rand() se dice que es cuatro veces más rápido que rand() , ¡simplemente añadiendo tres caracteres al frente!

Suponiendo que mt_rand está disponible, ¿cuál es la desventaja de usarlo?

mt_rand usa el algoritmo Mersenne Twister , que es mucho mejor que el LCG típicamente utilizado por rand . Por ejemplo, el período de un LCG es un mísero 2 32 , mientras que el período de mt_rand es 2 19937 – 1. Además, todos los valores generados por un LCG se encuentran en líneas o planos cuando se trazan en un espacio multidimensional. Además, no solo es factible en la práctica, sino que es relativamente fácil determinar los parámetros de un LCG. La única ventaja que tienen los LCG es que son potencialmente ligeramente más rápidos, pero en una escala que es completamente irrelevante cuando se codifica en php.

Sin embargo, mt_rand no es adecuado para fines criptográficos (generación de tokens, contraseñas o claves criptográficas) tampoco.

Si necesita aleatoriedad criptográfica, use random_int en php 7. En las versiones anteriores de php, lea desde /dev/urandom o /dev/random en un sistema operativo que cumpla con POSIX.

La peculiaridad de distribución que citó solo es relevante cuando el rango de números aleatorios que está generando es mayor que 2 ^ 32. Eso es 4294967296.

Si está trabajando con números tan grandes, y necesita que sean aleatorizados, quizás esta sea una razón para reconsiderar el uso de mt_rand() . Sin embargo, si trabajas con números más pequeños que este, entonces es irrelevante.

La razón por la que sucede se debe a la precisión del generador de números aleatorios que no es lo suficientemente bueno en esos rangos altos.

Nunca he trabajado con números aleatorios tan grandes, así que nunca tuve que preocuparme por eso.

La diferencia entre rand() y mt_rand() es mucho más que “solo tres caracteres adicionales”. Son llamadas a funciones completamente diferentes, y funcionan de formas completamente diferentes. Igual que no espera que print() e print_r() sean similares.

mt_rand() obtiene su nombre del algoritmo “Mersene Twister” que utiliza para generar los números aleatorios. Se sabe que este algoritmo es un generador de números aleatorios rápido, eficiente y de alta calidad, por lo que está disponible en PHP.

La función rand() hace uso del generador de números aleatorios del sistema operativo realizando una llamada al sistema. Esto significa que utiliza cualquier generador de números aleatorios que sea el predeterminado en el sistema operativo que está utilizando. En general, el generador de números aleatorios predeterminado usa un algoritmo mucho más lento y antiguo, de ahí la afirmación de que my_rand() es más rápido, pero variará de un sistema a otro.

Por lo tanto, para prácticamente todos los usos, mt_rand() es una mejor función para usar que rand() .

Usted dice “asumiendo que mt_rand() está disponible”, pero siempre será así desde que se introdujo en PHP4.