rand(1,N)
,但不包括array(a,b,c,..)
,
是否已经有一个我不知道的内置函数,或者我必须自己实现(如何?)?
更新
无论excluded array
的大小是否大,合格的解决方案都应该具有黄金性能。
最佳答案
没有内置功能,但是您可以执行以下操作:
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;
}
那是我的头上的事,所以它可以使用抛光-但至少您不能以无限循环的方式结束,即使是假设的情况也是如此。
注意:如果
$exceptions
耗尽了您的范围,该函数就会中断-例如显然,调用randWithout(1, 2, array(1,2))
或randWithout(1, 2, array(0,1,2,3))
不会产生任何有意义的结果,但是在这种情况下,返回的数字将不在$from
-$to
范围内,因此很容易捕获。如果保证
$exceptions
已经排序,则可以删除sort($exceptions);
。眼睛糖果:Somewhat minimalistic visualisation of the algorithm。