randomize - random name php
Diferencia entre mt_rand() y rand() (6)
Actualización (PHP 7.1):
rand()
ysrand()
ahora se han convertido en alias demt_rand()
ymt_srand()
, respectivamente. Esto significa que la salida para las siguientes funciones tiene cambios:rand()
,shuffle()
,str_shuffle()
yarray_rand()
.
Eso significa que desde la versión 7.1 no hay diferencia práctica entre ambos porque
rand
llama a
mt_rand
internamente
.
Antes de PHP 7.1:
Usar
rand()
no es una mala práctica si no se usa con fines de seguridad, generalmente uso
rand()
(hábito?).
Si necesita una enorme cantidad de números aleatorios, necesitará
mt_rand
en
mt_rand
lugar
rand
.
mt_rand
tiene un período de 2
19937
- 1, mucho mejor que
rand
(2
32
).
Eche un vistazo a
este artículo
sobre la generación de patrones gráficos usando
rand
y
mt_rand
.
Periodicity
y la
entropy
son las únicas razones para usar
mt_rand()
lugar de
rand()
y no para mejorar la seguridad o la velocidad.
Matemáticamente,
mt_rand
tiene más
entropy
y una mayor
Periodicity
que
rand
(2
19937
−1 vs. 2
32
).
Si necesita algunos números aleatorios y la seguridad no es un problema,
rand
hará el trabajo (obtenga un número aleatorio para decidir disparar un proceso de limpieza).
Probar mejoras de velocidad
En la práctica, no hay mucha diferencia en la velocidad entre las dos funciones (¿tal vez porque la sobrecarga del contenedor PHP⇔C?).
Código de prueba PHP:
<?php
for ($c = 0; $c < 3; $c++) {
$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 100000000; $i++) {
$sum += rand();
}
printf(''[rand %d] Time: %.3f s%s'', $c, microtime(true) - $start, PHP_EOL);
}
for ($c = 0; $c < 3; $c++) {
$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 100000000; $i++) {
$sum += mt_rand();
}
printf(''[mt_rand %d] Time: %.3f s%s'', $c, microtime(true) - $start, PHP_EOL);
}
Pruebas en PHP 7.0.19:
$ php timing.php
[rand 0] Time: 4.658 s
[rand 1] Time: 4.664 s
[rand 2] Time: 4.654 s
[mt_rand 0] Time: 4.267 s
[mt_rand 1] Time: 4.255 s
[mt_rand 2] Time: 4.261 s
Pruebas en PHP 5.4.45 (máquina más lenta):
$ php timing.php
[rand 0] Time: 10.862 s
[rand 1] Time: 10.889 s
[rand 2] Time: 10.615 s
[mt_rand 0] Time: 10.948 s
[mt_rand 1] Time: 9.883 s
[mt_rand 2] Time: 10.190 s
Solo 6-9% y no 400% como se afirma.
Uso por motivos de seguridad
Pero si su aplicación necesita mucha entropía debido a problemas de seguridad, necesitará una forma más segura y
openssl_random_pseudo_bytes()
posiblemente sea la mejor solución, ¿funciona (mucho mejor pero más lento? Necesitamos seguridad sobre la velocidad?)
Confiando en openssl cuestiones relacionadas
Ni
rand()
ni
mt_rand()
son lo suficientemente seguros
:
Precaución Esta función no genera valores criptográficamente seguros y no debe usarse con fines criptográficos. Si necesita un valor criptográficamente seguro, considere usar
random_int()
,random_bytes()
oopenssl_random_pseudo_bytes()
lugar.
Hay extensiones PHP como
random_compat
, pero no recomendé usarlas si no es necesario.
¿Cuál es la diferencia entre usar
mt_rand($min, $max)
y
rand($min, $max)
sobre la velocidad?
Actualizar
Desde PHP 7.1
mt_rand
ha reemplazado a
rand
completo, y
rand
se convirtió en un alias para
mt_rand
.
La respuesta a continuación se centra en las diferencias entre las dos funciones para versiones anteriores y las razones para introducir
mt_rand
.
¡La velocidad no era por
mt_rand
se introdujo
mt_rand
!
La función
rand
existía mucho antes de
mt_rand
, pero estaba profundamente defectuosa.
Un PRNG debe obtener algo de entropía, un número a partir del cual genera una secuencia de números aleatorios.
Si imprime una lista de diez números generados por
rand()
así:
for ($i=0;$i<10;++$i)
echo rand(), PHP_EOL;
La salida se puede utilizar para determinar cuál era la semilla del
rand
y, con ella, puede predecir los próximos números aleatorios.
Existen herramientas que hacen esto, así que busca un poco en Google y pruébalo.
También hay un problema con
rand
muestra patrones relativamente rápidos en sus números aleatorios
como se demuestra aquí
.
Un problema
mt_rand
parece resolver mucho mejor también.
mt_rand
utiliza un mejor algoritmo de aleatorización (Mersenne Twist), que requiere que se conozcan más números aleatorios antes de poder determinar la semilla
y que
sea más rápida.
Esto no significa que
mt_rand
sea, por definición, más rápido que
rand
, solo significa que la forma en que se generan los números es más rápida y parece no tener un impacto real en el rendimiento de la función, como lo han demostrado otras respuestas aquí.
De cualquier manera, eche un vistazo a
los documentos
mt_srand
y
mt_srand
.
Estoy seguro de que contendrán más información
Si el algoritmo de
mt_rand
traduce en un aumento en el rendimiento, entonces eso es excelente para usted, pero es una feliz coincidencia.
TL; TR:
mt_rand
se introdujo para solucionar los problemas que existen en
rand
!
A partir de PHP 7.1 no hay diferencia en absoluto . rand () ahora es un alias para mt_rand ().
Ver http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.rand-srand-aliases
Y más detalles: https://wiki.php.net/rfc/rng_fixes
El Manual de PHP en
mt_rand()
establece que:
que producirá números aleatorios cuatro veces más rápido que lo que proporciona el libc rand () promedio.
Parecen tener la misma velocidad:
function timeit($times, $func) {
$t = microtime(1);
while($times--) $func();
return microtime(1) - $t;
}
echo PHP_OS, " ", phpversion(), "/n";
echo timeit(100000, function() { rand(0,1000); }), "/n";
echo timeit(100000, function() { mt_rand(0,1000); }), "/n";
Resultados para OSX Mavericks y VirtualBox''ed Ubuntu 11:
Darwin 5.5.19
0.038038969039917
0.033117055892944
Linux 5.3.6-13ubuntu3.10
0.031459093093872
0.031935214996338
Si estas medidas son correctas, el comentario manual mencionado en otra parte debe considerarse incorrecto / obsoleto.
A continuación se muestra la diferencia de velocidad para ambos:
mt_rand($min, $max)
es
cuatro
veces más rápido en comparación con
rand($min, $max)
La razón es que
rand($min, $max)
usa
el generador de números aleatorios libc,
mientras que
mt_rand($min, $max)
usa
Mersenne Twister,
que es cuatro veces más rápido.
Espero que resuelva tu duda.
Gracias.