我正在实现一个系统,它需要将某个范围内的数字分配给一个人,但不使用以前使用过的任何数字。
请记住,数字范围和排除列表都将非常大。
最初,我认为做这样的事情是最好的:
<?php
$start = 1;
$end = 199999;
$excluded = array(4,6,7,8,9,34);
$found = FALSE;
while (!$found) {
$rand = mt_rand($start,$end);
if (!in_array($rand,$excluded)) {
$found = TRUE;
}
}
?>
但我认为这并不理想,可能会出现无限循环(或者需要很长时间/脚本超时)。
我还考虑过生成一个包含我需要的所有数字的数组,但是一个庞大的数组肯定会更糟吗?同样在 2 个大型阵列上进行阵列差异肯定也需要很长时间?像这样的东西:
<?php
$start = 1;
$end = 199999;
$allnums = range($start,$end);
$excluded = array(4,6,7,8,9,34);
$searcharray = array_diff($allnums,$excluded);
$rand = array_rand($searcharray);
?>
所以,我的问题是哪个是更好的选择?还有其他人以前使用过的(更好的)方法吗?