Hacer
range para crear un array de valores consecutivos y un
suffle al array para desordenarlo, y escoger después varios de esos números aleatorios, sólo tiene sentido si el número de elementos a extrar es una gran porción del conjunto total de números, por ejemplo si queremos obtener 50 valores distintos con un rango entre 1 y 100. Esta filosofía tiene una mejora, y es no hacer un
shuffle, si no un
array_rand, que saca valores al azar. Así mejoras algo el tiempo de ejecución, pero no el consumo de memoria, que sigue siendo disparatado en comparación al problema a resolver.
Si la porción de números a sacar es escasa, como este caso (queremos 5 de 49), la fuerza bruta es mejor porque además de consumir menos recursos de memoria (siempre consume menos), también tardará menos.
La evidencia:
http://ideone.com/CDC6om
Código PHP:
Ver original<?php
function azarSuffle($min, $max, $cantidad) {
$numeros = range($min, $max); }
function azarBruto($min, $max, $cantidad) {
while (count($numeros)<$cantidad){ $aleatorio=rand($min, $max); if (!in_array($aleatorio, $numeros)) $numeros[]=$aleatorio; }
return $numeros;
}
function azarMejor($min, $max, $cantidad) {
$numeros = range($min, $max); }
for ($i=0;$i<1000;$i++)
azarSuffle(1,49,5);
$tiempoSuffle=$fin-$ini;
for ($i=0;$i<1000;$i++)
azarBruto(1,49,5);
$tiempoBruto=$fin-$ini;
for ($i=0;$i<1000;$i++)
azarMejor(1,49,5);
$tiempoMejor=$fin-$ini;
echo "Con suffle: ".$tiempoSuffle."\n";
echo "Fuerza bruta: ".$tiempoBruto."\n";
echo "Mejor: ".$tiempoMejor;
?>
Resultado:
Código BASH:
Ver originalCon suffle: 13
Fuerza bruta: 7
Mejor: 11