Ver Mensaje Individual
  #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