Foros del Web » Programando para Internet » PHP »

Excluir numeros con rand

Estas en el tema de Excluir numeros con rand en el foro de PHP en Foros del Web. uso rand() para elegir al azar un numero de un rango de numeros preestablecidos, me gustaria saber como hacer para excluir numeros dentro de ese ...
  #1 (permalink)  
Antiguo 03/04/2015, 13:19
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 18 años, 5 meses
Puntos: 2
Excluir numeros con rand

uso rand() para elegir al azar un numero de un rango de numeros preestablecidos, me gustaria saber como hacer para excluir numeros dentro de ese rango?

Código PHP:
Ver original
  1. int rand ( int $min , int $max )


Ejemplo

del 1 al 20 excluir el 8, 11, 14 y 19.

gracias.
  #2 (permalink)  
Antiguo 03/04/2015, 13:32
(Desactivado)
 
Fecha de Ingreso: abril-2015
Ubicación: España
Mensajes: 616
Antigüedad: 9 años
Puntos: 74
Respuesta: Excluir numeros con rand

Código PHP:
Ver original
  1. $excluir = array(8,11,14,19);
  2. $numero = -1;
  3. while(true)
  4. {
  5.     $numero = rand(1,20);
  6.     if(!in_array($numero, $excluir))
  7.         break;
  8. }
  9. echo $numero;

Aunque este código, si hay muchos números a excluir, podría ser ineficiente.

Última edición por superweb360; 03/04/2015 a las 15:24
  #3 (permalink)  
Antiguo 03/04/2015, 15:57
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Excluir numeros con rand

Haz un array en el que pongas los números que quieres excluir, saca el número por medio de rand() y si ese número está en el array de excluidos, en ve de mostrarlo que vuelva a sacar el número...
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #4 (permalink)  
Antiguo 03/04/2015, 16:43
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Excluir numeros con rand

Prueba:

Código PHP:
Ver original
  1. $excluidos = array(8,11,14,19);
  2. $aleatorio = rand(1,20);
  3. if(in_array($aleatorio,$excluidos)) {
  4. $aleatorio = rand(1,20); }
  5. else {
  6. echo $aleatorio; }
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #5 (permalink)  
Antiguo 03/04/2015, 17:35
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 18 años, 5 meses
Puntos: 2
Respuesta: Excluir numeros con rand

son como 120 numeros a excluir pero no funciona siguen apareciendo los numeros excluidos.

de las dos formas la de superweb360 y la de rodrypaladin
  #6 (permalink)  
Antiguo 03/04/2015, 17:41
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Excluir numeros con rand

Añade los numeros que quieres excluir al array y estos no saldrán, luego modifica el rango del rand(), si funciona porque lo estoy probando.
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #7 (permalink)  
Antiguo 03/04/2015, 17:47
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 18 años, 5 meses
Puntos: 2
Respuesta: Excluir numeros con rand

tu codigo comprueba una vez y se se repite manda de nuevo al rand pero ahi es donde se vuelve a repetir.

Ese creo que es el problema.
  #8 (permalink)  
Antiguo 03/04/2015, 19:56
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 18 años, 5 meses
Puntos: 2
Respuesta: Excluir numeros con rand

Me estoy rompiendo la cabeza todos los codigos que pruebo o no funcionan, o hacen exactamente lo contrario y seleccionan el numero al azar entre los numeros excluidos.
  #9 (permalink)  
Antiguo 03/04/2015, 23:06
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Excluir numeros con rand

Hay varias formas de lograrlo.

1) Este mostrara siempre 50, ya que es el único numero no excluido.
Código PHP:
Ver original
  1. <?php
  2.     $excluir = range(0, 49);
  3.    
  4.     while(in_array(($rand = rand(0, 50)), $excluir));
  5.     echo $rand;

El problema con ese algoritmo es que existe un pequeña probabilidad de que cuelgue al script en un loop infinito.

Una mejor solución seria que en caso de error, tome al numero mas cercano disponible:
Código PHP:
Ver original
  1. <?php
  2.     $excluir = range(0, 49);
  3.    
  4.     $rango = [0, 50];
  5.    
  6.     $rand = rand($rango[0], $rango[1]);
  7.     if(($key = array_search($rand, $excluir)) !== false)
  8.     {
  9.         $rand = false;
  10.        
  11.         if($excluir[$key] < $rango[1])
  12.         {
  13.             for($nro = $excluir[$key]; $nro <= $rango[1]; $nro++)
  14.                 if(!in_array($nro, $excluir))
  15.                 {
  16.                     $rand = $nro;
  17.                     break;
  18.                 }            
  19.         }
  20.        
  21.         if($rand === false)
  22.         {
  23.             for($nro = $excluir[$key]; $nro >= $rango[0]; $nro--)
  24.                 if(!in_array($nro, $excluir))
  25.                 {
  26.                     $rand = $nro;
  27.                     break;
  28.                 }            
  29.         }
  30.         unset($nro, $key);
  31.     }
  32.     echo $rand;

El problema que tiene ese, es que si generas entre el 0 y el 50 y excluis del 10 al 49 y en al random sale 10, va a mostrar 50 en lugar de 9 que esta mas cerca, entonces, una mejora posible es que en caso de error muestre al primer numero en valor absoluto:

Código PHP:
Ver original
  1. <?php
  2.     $excluir = range(0, 49);
  3.  
  4.     $rango = [0, 50];
  5.  
  6.     $rand = rand($rango[0], $rango[1]);
  7.     if(($key = array_search($rand, $excluir)) !== false)
  8.     {
  9.         $rand = false;
  10.  
  11.         $van = -1;
  12.         $vap = 1;
  13.  
  14.         while($rand === false && ($van !== false || $vap !== false))
  15.         {
  16.             if($vap !== false)
  17.             {
  18.                 $va = $excluir[$key] + $vap;
  19.                 if($va <= $rango[1]) {
  20.                     if(!in_array($va, $excluir))
  21.                         $rand = $va;
  22.                     else
  23.                         $vap++;
  24.                 }
  25.                 else
  26.                     $vap = false;
  27.             }
  28.  
  29.             if($van !== false && $rand === false)
  30.             {
  31.                 $va = $excluir[$key] + $van;
  32.                 if($va >= $rango[0]) {
  33.                     if(!in_array($va, $excluir))
  34.                         $rand = $va;
  35.                     else
  36.                         $van--;
  37.                 }
  38.                 else
  39.                     $van = false;
  40.             }
  41.         }
  42.  
  43.         unset($van, $vap, $va, $key);
  44.     }
  45.     echo $rand;
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 04/04/2015 a las 10:07
  #10 (permalink)  
Antiguo 04/04/2015, 00:15
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 18 años, 5 meses
Puntos: 2
Respuesta: Excluir numeros con rand

Gracias. ya funciona.

Última edición por juansemaster; 04/04/2015 a las 01:39

Etiquetas: excluir, numeros, rand
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 20:16.