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

10-07 14:46