Holas que tal
macwarez, estube pensando en tu problema, y he llegado a una solucion, talvez no es la mejor, pero si soluciona el problema. ( al paracer el algoritmo es exponencial xD , pero se demoro como 7 segundos al eleigir entre 0 y 10000, 5000 numeros al azar que no se repitan :P ).
Te explico un poco el script para q lo entiendas.
funcion
insertar_bd, esta funcion la debes completar, debes poner todos los parametros necesarios y el algoritmo para realizar el insercion del numero en la base de datos, esta funcion siempre va a recibir un numero que ya no se encuentre en la bd, por lo menos en la primera ejecucion pos, se entiende.
function
registro , esta funcion es recursiva (se llama a si misma), tiene como parametros un array pasado por referencia ( es decir, todas las llamadas al a funcion trabajan en el mismo array ) y un numero, la logica de la funcion es, si el numero ya existe en la matriz, genera otro y vuelve a llamar a la funcion, hasta que encuentre un numero que no existe en el registro, este numero lo guarda en el registro y lo manda a la funcion
insertar_bd
Luego simplemente viene $max (el maximal del rango de numero) $min (el minimo del rango de numeros) y $n la cantidad de numeros a selecionar.
Luego viene un for que se repite $n veces y llama a la funcion registro.
Código PHP:
<?
// Script by DeeRme http://deerme.org
// Numero al Azar
// Vamos a selecionar 1000 Numeros entre 0 y 5000
// No queremos colisiones, es decir, que no se repitan dos Numeros
// Vamos a utilizar un Array de Registro
// *************************************************************
// Funciones
function insertar_en_bd($n)
{
// Datos Necesario para Insertar el $n en la Base de Datos
return TRUE;
}
/* Funcion Recursiva, si el numero ya esta en el array vuelve a llamar a la misma funcion, si el numero no existe, lo guarda,La Funcion requiere variables Globales, min y max*/
function registro(&$array,$n)
{
global $min;
global $max;
if ( in_array($n,$array) )
{
// llamamos denuevo a la funcion
registro($array,rand($min,$max));
}
else
{
// El numero No existe en el registro, lo guardamos en el registro y en la base de datos
$array[]=$n;
insertar_en_bd($n);
}
}
// *************************************************************
// Minimo y Maximo de los Numeros a Eligir
$max=10000;
$min=0;
// Numero de Numeros a Eligir
$n=5000;
$array=array();
for($i=0;$i<=$n;$i++)
{
$n_azar=rand($min,$max);
// Llamamos a la funcion recursiva Registro, si el numero ya esta registrado, genera otro sucesivamente hasta que no se encuentre en el registro y lo almacena en el registro y en la bd
registro($array,$n_azar);
}
print_r($array);
?>
- Trabaje en un Array de Registro, pero tambien podrias trabajar en una tabla de tu base de datos de registro, pero de esta manera seria todo mas lento.
- Lo encontre medianamente util, ya que genero 5000 numeros al azar entre 0 y 10000, en como 7 segundos
Hay tu ves que puedes adaptar del Script para tus necesidades, saludos :P