Foros del Web » Programando para Internet » PHP »

nuemero aleatorio que no se repita

Estas en el tema de nuemero aleatorio que no se repita en el foro de PHP en Foros del Web. saludos estoy intentando generar un numero aleatorio que no se repita por ejemplo genero un numero mt_rand(1,5000); y lo guardo en una variable que a ...
  #1 (permalink)  
Antiguo 14/02/2007, 18:08
 
Fecha de Ingreso: diciembre-2003
Mensajes: 82
Antigüedad: 20 años, 11 meses
Puntos: 1
nuemero aleatorio que no se repita

saludos estoy intentando generar un numero aleatorio que no se repita por ejemplo genero un numero mt_rand(1,5000); y lo guardo en una variable que a su ves la guardo en una base de datos luego genero una consulta para cargar los números guardados en la base pero con que función puedo comparar esos numero que están guardados para que si hay un numero repetido me genere otro distinto hay alguna función que pueda hacer eso he intentado con while() y foreach pero no me da resultado les agradecería mucho la ayuda.
  #2 (permalink)  
Antiguo 14/02/2007, 21:55
Avatar de carlosmbrizuela  
Fecha de Ingreso: enero-2007
Ubicación: La Plata (Argentina)
Mensajes: 490
Antigüedad: 17 años, 10 meses
Puntos: 1
Re: nuemero aleatorio que no se repita

queres que el numero no se repita mas? metelos en una tabla y pregunta si esta ahi. la funcion random tira numeros de A a B y no le interesa si se repiten o no. Solo tira numeros haciendo un calculo matematico.

Saludos
  #3 (permalink)  
Antiguo 14/02/2007, 22:33
Avatar de Gurrutello  
Fecha de Ingreso: enero-2002
Ubicación: Ontario,Toronto [Canada]
Mensajes: 2.017
Antigüedad: 22 años, 10 meses
Puntos: 6
Re: nuemero aleatorio que no se repita

Hola
Para generar un numero unico y no hace falta que sea aleatorio
$mi_numero = time();

este numero seguro que no se repite ya que coge la hora del servidor.

para reliarlo mas usa
$mi_numero = md5(time());
hay mil formas
saludos
__________________
Un Saludo
www.tutores.org
Asp | Php | Javascript | Perl | Coldfusion | Flash | +- 2000 codigos
  #4 (permalink)  
Antiguo 15/02/2007, 09:14
Avatar de 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
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:23.