No costruito -in funzione, ma è possibile fare questo:
function randWithout($from, $to, array $exceptions) {
sort($exceptions); // lets us use break; in the foreach reliably
$number = rand($from, $to - count($exceptions)); // or mt_rand()
foreach ($exceptions as $exception) {
if ($number >= $exception) {
$number++; // make up for the gap
} else /*if ($number < $exception)*/ {
break;
}
}
return $number;
}
Questo è fuori dalla mia testa, quindi potrebbe usare la lucidatura - ma almeno non si può finire in uno scenario a ciclo infinito, anche ipoteticamente.
Nota: Le interruzioni di funzione se $exceptions
scarichi vostra gamma - ad esempio chiamare randWithout(1, 2, array(1,2))
o randWithout(1, 2, array(0,1,2,3))
non darà alcun risultato ragionevole (ovviamente), ma in tal caso, il numero restituito sarà al di fuori della gamma $from
- $to
, quindi è facile da catturare.
Se è già possibile ordinare $exceptions
, è possibile rimuovere sort($exceptions);
.
Eye-candy: Somewhat minimalistic visualisation of the algorithm.
È il vostro 'allineamento esclusa' probabile che essere ordinati? In tal caso è possibile rimuovere la chiamata 'asort()' nella mia funzione, che dovrebbe accelerare notevolmente le cose. – pinkgothic
Er, 'sort()'. Scusa, lo sto fissando da troppo tempo. >. (Off per prendere un po 'di aria fresca!) – pinkgothic
Ri: "sembra che mi serva del tempo per digerire la tua soluzione", avere una visualizzazione di ciò che fa il mio algoritmo: http://pandora.pinkgothic.com/randWithout.png (eccetto per favore immagina che il rand (0,8) legge rand (1,8), sto saltando i cerchi qui per ottenere immagini caricate, ero di fretta XD) – pinkgothic