Brak wbudowanego -w funkcji, ale możesz może zrobić:
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;
}
To z mojej głowy, więc mógłbym użyć polerowania - ale przynajmniej nie możesz skończyć w nieskończonej pętli, nawet hipotetycznie.
Uwaga: Przerwy funkcyjne jeśli $exceptions
wydechy swoją range - na przykład wywoływanie randWithout(1, 2, array(1,2))
lub randWithout(1, 2, array(0,1,2,3))
nie spowoduje niczego sensownego (oczywiście), ale w takim przypadku zwrócona liczba będzie poza zakresem $from
- $to
, więc łatwo ją złapać.
Jeśli zagwarantowane jest już sortowanie $exceptions
, można usunąć .
Eye-candy: Somewhat minimalistic visualisation of the algorithm.
Czy Twój 'array wykluczone' może być sortowane? Jeśli tak, możesz usunąć wywołanie funkcji "asort()" w mojej funkcji, co powinno znacznie przyspieszyć działanie. – pinkgothic
Er, 'sort()'. Przepraszam, patrzyłem na to zbyt długo. >.> (Off, aby złapać trochę świeżego powietrza!) – pinkgothic
Re: "Wydaje mi się, że potrzebuję czasu na przetrawienie twojego rozwiązania", wizualizacja tego, co robi mój algorytm: http://pandora.pinkgothic.com/randWithout.png (z wyjątkiem proszę wyobraź sobie, że rand (0,8) czyta rand (1,8), przeskakuję tutaj przez obręcze, aby pobrać obrazy, byłem w pośpiechu. XD) – pinkgothic