Ver Mensaje Individual
  #4 (permalink)  
Antiguo 15/02/2007, 09:14
Avatar de DeeR
DeeR
 
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 11 meses
Puntos: 17
Re: nuemero aleatorio que no se repita

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