Foros del Web » Programación para mayores de 30 ;) » Programación General »

Algoritmo de numeros aleatorios sin repetir el que ya ha salido

Estas en el tema de Algoritmo de numeros aleatorios sin repetir el que ya ha salido en el foro de Programación General en Foros del Web. Buenas a todos, Estoy haciendo un programa en el que necesito una especie de algoritmo que me arroje un numero aleatorio de 1 a uno ...
  #1 (permalink)  
Antiguo 15/08/2008, 14:05
 
Fecha de Ingreso: diciembre-2005
Ubicación: BCN
Mensajes: 165
Antigüedad: 18 años, 11 meses
Puntos: 2
Algoritmo de numeros aleatorios sin repetir el que ya ha salido

Buenas a todos,

Estoy haciendo un programa en el que necesito una especie de algoritmo que me arroje un numero aleatorio de 1 a uno cualquiera, sin que cuando lo vuelva a usar me arroje un numero que ya me ha dado anteriormente.

Es decir si en un bucle primero me d un 3, luego al repetir el bucle ya no me puede mandar nunca mas un 3.

Lo mas corto que se me ha ocurrido es hacer un rand(); y luego pasarlo por un filtro con un if, en el que compruebo si ese numero ya esta en una cadena, si esta se repite y si no, pasa adelante y en la cadena se añade tal numero.

No se si es la correcta pero el caso es que con poca informacion, el programa me lo tira bien pero a la que lo cargo, se tira muchisimo rato procesando y se cuelga.

Espero que podais ayudarme,

Muchas gracias!
  #2 (permalink)  
Antiguo 15/08/2008, 14:08
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Pregunta Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

Yo no le veo mejor forma de hacer.

Ahora, ¿Por qué tienen que ser números aleatorios? ¿No sería mejor ir arrojando números consecutivos?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 15/08/2008, 14:44
 
Fecha de Ingreso: julio-2008
Ubicación: Buenos Aires, Mar del plata
Mensajes: 250
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

El problema es que las comparaciones "if" es lo que mas tarda en hacer una pc.
Degrada mucho al programa en si...obviamente que estamos hablando de nanosegundos, pero si vamos sumando se puede tornar un poco inestable.

En que situación querés generar números? Porque la cadena que almacenas los números que ya salieron se puede transformar en una cadena gigante si el programa sigue y sigue...

Si son pocos números, si guardarlos en un vector o lista para ir comparando...pero tené en cuenta que esto no puede crecer exponencialmente....


saludos...
  #4 (permalink)  
Antiguo 16/08/2008, 06:26
 
Fecha de Ingreso: diciembre-2005
Ubicación: BCN
Mensajes: 165
Antigüedad: 18 años, 11 meses
Puntos: 2
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

Hola a todos,

En primer lugar, aclarare por que tienen que ser numeros aleatorios. Todo esto lo necesito para un generador de horarios escolares vale? Enonces, pongo una lista de asignaturas, cada una con su ID, y cuando arroja un numero aleatorio, por ejemplo el 5, la asignatura con ID-5 se pone en el primer hueco, y asi succesivamente.

Alemanarg, lo que dices de la cadena es cierto y por eso quiero cambiar el sistema.
Mira aqui tienes un ejemplo del script:

Código PHP:
 for($i=1$i<=$as$i++) 
     {
      
$ale mt_rand(1,$mat);
      if( 
$ale == $mat )
      {
      
$mat $mat 1;
      }
      
$bus substr_count($ale_cad$ale);
      
          while ( 
$bus != || $h[$ale] == 0)
              {
              
$ale_cad $ale_cad.$ale;
              
$ale mt_rand(1,$mat);
              
              if( 
$ale == $mat )
                 {
                  
$mat $mat 1;
                  }
                 
               
$bus substr_count($ale_cad$ale);
              }
        
$mat $amat;
        
$ale_cad $ale_cad.$ale;
        
$h[$ale] = $h[$ale] - 1
Variables:

$mat - numero de materias totales que introducimos
$h[$] - id de la materia
$ale_cad - cadena que se va creando
$ale - aleatorio del 1 al $mat
$as - horas que tiene este dia

en fin ese es mi sistema.por ciero no se lo que son los vectores en php.

A ver si encontrmos otro para ir mas rapido y que no se cuelgue.

Muchas gracias!
  #5 (permalink)  
Antiguo 24/08/2008, 17:11
 
Fecha de Ingreso: julio-2008
Mensajes: 21
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

Código PHP:
$ar=array(0,1,2,3,4,5,6,8);
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
shuffle($ar);
print 
array_shift($ar);
echo 
'<br/>'
  #6 (permalink)  
Antiguo 24/08/2008, 17:12
 
Fecha de Ingreso: julio-2008
Mensajes: 21
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

ejecuta ese código a ver si te vale
  #7 (permalink)  
Antiguo 19/12/2008, 10:29
 
Fecha de Ingreso: marzo-2004
Ubicación: Cusco
Mensajes: 1
Antigüedad: 20 años, 8 meses
Puntos: 0
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

Gracias por su ayuda reciendo ando aprendiendo el PHP y estaba liando con este tema... buen aporte!
  #8 (permalink)  
Antiguo 30/05/2011, 05:20
 
Fecha de Ingreso: mayo-2011
Mensajes: 1
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

porque desarrollas un generador de horarios? ya existen varios, el mejor que conozco (he trabajado con varios...) es Untis Express:

http://www.programahorario.com/index.php?lang=SP

es facil de usar y el algoritmo contiene experiencias de mas de 40 anos
  #9 (permalink)  
Antiguo 31/05/2011, 20:37
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

Tendrias que optimizar el chequeo. A la larga se hace muy lento ir comparando cada numero con cada uno que salio.
Una optimizacion posible seria mantener ordenada la lista. Asi comparamos mietras el numero sea menor, si llegamos a uno mayor y no es nuestro numero, listo no salio.
Otra solucion seria posible si los numero aleatorios que generas tiene una cota maxima (no demasiada grande). Entonces te creas un array de esa dimension seteado a cero, cuando sale un numero el indice que corresponda a ese numero lo pasas a uno. Para comprara simplemente haces array[numero] == 0 si es true el numero no salio. Esto hace que las comparaciones sean en tiempo constante.

Por ultimo podrias implementar alguna estructura de datos como como un arbol binario para hacer busqueda binaria. Busca sobre estos temas que estan bastantes copados y ayudan muchos.

Espero que alguna de las tres formas te ayuden.
  #10 (permalink)  
Antiguo 29/07/2012, 12:39
 
Fecha de Ingreso: julio-2012
Ubicación: Mérida, México
Mensajes: 1
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Algoritmo de numeros aleatorios sin repetir el que ya ha salido

La idea que da <<acido69>> es muy buena, y creo que desde las 2 primeras lineas que el menciona el problema ya esta resuelto pues la función <<shuffle>> es lo que hace, mezclar los elementos del arreglo, así que ya estan en un orden "aleatorio". Ahora sólo faltaría recorrer este arreglo y se va obteniendo los numeros en el desorden en el que ya los puso la función mencionada.
Yo necesitaba lo mismo y así lo hice esas 2 primeras lineas me sirvieron:

1. Usar <<range(1,X)>> donde X es ese número cualquiera y asignar este array a una variable.
2. Usar <<shuffle($arreglo)>>.
3. Recorrer la variable <<$arreglo>> que ya esta en orden aleatorio.

Espero haber dado más ideas salu2.

Última edición por erberth; 29/07/2012 a las 12:45
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:16.