Foros del Web » Programando para Internet » PHP »

Creación de 100mil Números ¿Pseudoaleatorios?!

Estas en el tema de Creación de 100mil Números ¿Pseudoaleatorios?! en el foro de PHP en Foros del Web. Cordial Saludo! Amigos de Forosdelweb, en esta ocasión abro este foro para hacerles una consulta. Tengo que crear un consecutivo de Números para un sistema ...
  #1 (permalink)  
Antiguo 23/02/2011, 14:44
 
Fecha de Ingreso: febrero-2011
Mensajes: 3
Antigüedad: 13 años, 2 meses
Puntos: 0
Pregunta Creación de 100mil Números ¿Pseudoaleatorios?!

Cordial Saludo!

Amigos de Forosdelweb, en esta ocasión abro este foro para hacerles una consulta.

Tengo que crear un consecutivo de Números para un sistema de Boletos,
Son 100.000 Números, los cuales por supuesto no pueden repetirse.
He realizado pruebas con la generación de Números pseudoaleatorios con el cual he podido generar hasta más o menos 37.000 Números únicos...

Pregunta,
¿Alguna idea de como puedo generar estos 100mil números?

Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 23/02/2011, 15:01
 
Fecha de Ingreso: junio-2009
Ubicación: Madrid
Mensajes: 402
Antigüedad: 14 años, 10 meses
Puntos: 20
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

print rand(1, 1000000); has probado? y para cada numero que saca lo guarda en una cache y luego comprueba si esta alli y si no el numero es valido.
  #3 (permalink)  
Antiguo 23/02/2011, 15:09
 
Fecha de Ingreso: febrero-2011
Mensajes: 3
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

Hola w0rldart,
Muchas gracias por tu respuesta, creo que me faltó especificar un "poco".
Cada uno de estos 100mil números deben de tener 9 cifras.
Actualmente los estoy generando y consultando a una base de datos, si ya existe no lo guarda e intenta generarlo nuevamente.
Desgraciadamente el Script que estoy usando no se porqué solamente es capaz de generar las 37k combinaciones que anteriormente comente,

Mil gracias nuevamente,
Saludos!
  #4 (permalink)  
Antiguo 23/02/2011, 15:11
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

100.000 números aleatorios ?..
si es que son números... y son 100.000 .. pues.. no te queda otra que sea del 1 al 100.000 no ?...

$numeros = range(1, 100000);

saludos =)
  #5 (permalink)  
Antiguo 23/02/2011, 15:16
 
Fecha de Ingreso: febrero-2011
Mensajes: 3
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

Cita:
Iniciado por Hidek1 Ver Mensaje
100.000 números aleatorios ?..
si es que son números... y son 100.000 .. pues.. no te queda otra que sea del 1 al 100.000 no ?...

$numeros = range(1, 100000);

saludos =)
Hidek1 Muchas gracias por tu respuesta también, cómo lo señalé en mi anterior respuesta estos 100mil números deben de tener 9 cifras cada uno.

Este es el código que estoy utilizando.

Index.php
Código PHP:
<?php
include("conexion.php");
?>
<?php
include_once("aleatorio.php");
for(
$c=0;$c<100;$c++){
    
$rnd=new Aleatorios();
    
    
$codigoNum=$rnd->getAleatorio("dec",9);
    
    echo 
$c."<p>";
   
    echo 
"Decimal Numero Sorteo ".$codigoNum."<p>";
   
    
    
$sql="select num from numero";
    
$consulta=mysql_query($sql)or die(mysql_error());
    
$tn mysql_num_rows($consulta);
    
$stop=$tn;    
    
    if(
$tn==0){
        
mysql_query("insert into numero values('$c','$codigoNum')");
    
$error=mysql_errno();
        echo 
$error;
    }else{
        
$res=0;
            for(
$in=1$in<=$stop$in++)
            {
            
$tn mysql_fetch_array($consulta); 
            
$num=$tn['num'];
            if(
$num==$codigoNum){
                
$res=1;
                
$i=$stop;
                echo 
"se repitio y todo paro<p>";
            }
            }
            if(
$res==0){
    
mysql_query("insert into numero values('$c','$codigoNum')");
    
$error=mysql_errno();
        echo 
$error;
            }
}
}
?>
aleatorio.php

Código PHP:
<?php
 
    
//  +-------------------------------------------------------------------+
    //  |  Autor: Francisco Jesus Jimenez Alvarez                           |
    //  |  "The boss"                                                       |
    //  |  8 de Julio de 2009 11:32h                                        |
    //  |  [email protected]                                  |
    //  |  Licencia GPL en su última versión.                               |
    //  +-------------------------------------------------------------------+
 

 
    //  +-------------------------------------------------------------------+
    //  |  TAD Aleatorios. Generador de numeros aleatorios con distintos    |
    //  |  formatos.                                                        |
    //  +-------------------------------------------------------------------+
    
    
    
class Aleatorios{
        
        private 
$_tipo;
        
        function 
__construct(){
            
$this->_tipo=array("hex","dec","bin");
        }
        
        
        
        
//@  PARAMETRO 1: (OBLIGATORIO)Recibe el tipo:
        //@  hex ->  código hexadecimal
        //@  bin ->  código binario
        //@  dec ->  código decimal 
        
        //@ PARAMETRO 2: (OBLIGATORIO)Recibe la longitud del codigo deseado
        
        //@ PARAMETRO 3: (OPCIONAL) TRUE/FALSE
        //@  TRUE -> LETRAS EN MAYÚSCULAS
        //@  FALSE -> LETRAS EN MINÚSCULAS
        
        //@ Ejemplo: $rn->getAleatorio("hex",16,TRUE);
        
        
        //@ genera un numero aleatorio y lo devuelve.
        
public function getAleatorio($tipo,$lon,$mayus 0){
            
        
            if(
strcmp$tipo,$this->_tipo[0] ) == )
            {
                
$caracteres=array(48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70);
                
$codigo="";
                 for(
$i=0;$i<$lon;$i++)
                {
                     
$letra=chr($caracteres[rand(0,15)]);
                    if(
$mayus==1)
                        
$codigo .= strtoupper($letra);
                    else if(
$mayus==0)
                        
$codigo .= strtolower($letra);
                    
//i echo $i;
                
}
                return 
$codigo;
            }
            if(
strcmp$tipo,$this->_tipo[1] ) == )
            {
                
                
$codigo="";
                 for(
$i=0;$i<$lon;$i++)
                {
                     
$letra=rand(0,9);
                    if(
$mayus==1)
                        
$codigo .= strtoupper($letra);
                    else if(
$mayus==0)
                        
$codigo .= strtolower($letra);
                    
//i echo $i;
                
}
                return 
$codigo;
            }
            if(
strcmp$tipo,$this->_tipo[2] ) == )
            {
                
                
$codigo="";
                 for(
$i=0;$i<$lon;$i++)
                {
                     
$letra=rand(0,1);
                    if(
$mayus==1)
                        
$codigo .= strtoupper($letra);
                    else if(
$mayus==0)
                        
$codigo .= strtolower($letra);
                    
//i echo $i;
                
}
                return 
$codigo;
            }
        }
    }
?>

Última edición por betadesign10; 23/02/2011 a las 15:22
  #6 (permalink)  
Antiguo 23/02/2011, 16:05
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

Creo que el problema es más bien desordenar los números, lo cual se podría hacer así:
1. Creas un arreglo de la siguiente manera:

Código PHP:
Ver original
  1. for($x=100000000;$x<100100001;x++)
  2.      $arr[]=$x;
2. creas un bucle para vaciar el array así:

Código PHP:
Ver original
  1. while($c=count($ar)){
  2.     $pos=rand(1,$c);
  3.     echo $arr[$pos];//imprimimos un numero al azar, o se puede guardar en algun lugar
  4.     unset($ar[$pos]);//eliminamos el numero para que vuelva a salir.
  5. }
Claro que puedes modificar el rango que señale (100000000,100100001).

de lo contrario podrías hacer algo así como
rand(100000000,100100000); que te daría numeros de 9 cifras, repetirlo muuuchas veces y verificar que no tengas el numero repetido hasta que consigas los 100,000, por fuerza muy bruta.
  #7 (permalink)  
Antiguo 23/02/2011, 21:43
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

Yo hubiera optado por hacer algun tipo de calculo con la fecha EXACTA en la que el usuario hace el INSERT.
Talvez usando microtime()
  #8 (permalink)  
Antiguo 23/02/2011, 23:42
 
Fecha de Ingreso: abril-2010
Mensajes: 159
Antigüedad: 14 años
Puntos: 11
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

algo asi?

no se si se repite
Código PHP:
<?php
$str 
"12345678901234567890";
$cad "";
for(
$i=0;$i<9;$i++) {
$cad .= substr($str,rand(0,10),1);
}
echo 
$cad;
?>
  #9 (permalink)  
Antiguo 24/02/2011, 02:35
Avatar de oso96_2000  
Fecha de Ingreso: junio-2002
Ubicación: Distrito Federal
Mensajes: 558
Antigüedad: 21 años, 10 meses
Puntos: 35
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

Tu logica en el script donde consultas/insertas en la bd esta mal. Tendrias que realizar un select usando como condicion el numero que generaste y entonces, actuar segun el numero de filas devueltas.

Código PHP:
Ver original
  1. $sql = mysql_query("SELECT num FROM numeros WHERE num = '$rnd'");
  2.  
  3. if (mysql_num_rows($sql) == 0) {
  4.     mysql_query("INSERT INTO numeros (num) VALUES('$rnd')");
  5. }

Algo así.. por el otro lado, aquí te dejo un código -y la explicación de como funciona- que te genera X cantidad de números aleatorios.

Código PHP:
Ver original
  1. <?php
  2. $numbers = array();
  3. do {
  4.     $rnd = mt_rand(100000000, 999999999);
  5.     if (in_array($rnd, $numbers)) continue;
  6.     $numbers[] = $rnd;
  7. } while (count($numbers) <= 1000);
  8.  
  9. print_r($numbers);

Lo estoy limitando a solamente 1000 numeros. Se crea un arreglo que es el que ira guardando los numeros. Luego con un do-while se empieza la generacion de los mismos. Un simple mt_rand con el rango adecuado te da los numeros de 9 cifras que buscas. Una vez que se tiene ese numero aleatorio, se comprueba que no exista ya en el arreglo, y si existe, nos vamos a generar un nuevo numero. Asi hasta que el total de elementos de el arreglo sean 1000.

Eso si, probé en mi maquina correr el script generando los 100000 numeros y me tomo un rato... 10m31.942s
__________________
Sin Ideas
  #10 (permalink)  
Antiguo 24/02/2011, 06:39
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Creación de 100mil Números ¿Pseudoaleatorios?!

insisto en que .. si quieres 100 combinaciones de numeros positivos que no se repitan...
NO te queda otra opcion mas que poner del 1 al 100... es logico..
y si quieres que tengan 9 caracteres.. pues es tan simple como usar sprintf

Código PHP:
<?php
$foo 
range(11000);
array_walk($foo, function(&$value){
    
$value sprintf('%09d'$value);
});
print_r($foo);
saludos.

Etiquetas: creación
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 16:04.