Hay varias formas de lograrlo.
1) Este mostrara siempre 50, ya que es el único numero no excluido.
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<?php
$rango = [0, 50];
$rand = rand($rango[0], $rango[1]); {
$rand = false;
if($excluir[$key] < $rango[1])
{
for($nro = $excluir[$key]; $nro <= $rango[1]; $nro++)
{
$rand = $nro;
break;
}
}
if($rand === false)
{
for($nro = $excluir[$key]; $nro >= $rango[0]; $nro--)
{
$rand = $nro;
break;
}
}
}
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<?php
$rango = [0, 50];
$rand = rand($rango[0], $rango[1]); {
$rand = false;
$van = -1;
$vap = 1;
while($rand === false && ($van !== false || $vap !== false))
{
if($vap !== false)
{
$va = $excluir[$key] + $vap;
if($va <= $rango[1]) {
$rand = $va;
else
$vap++;
}
else
$vap = false;
}
if($van !== false && $rand === false)
{
$va = $excluir[$key] + $van;
if($va >= $rango[0]) {
$rand = $va;
else
$van--;
}
else
$van = false;
}
}
unset($van, $vap, $va, $key); }
echo $rand;