Php x和y之间的随机数,不包括中间的一系列数字

Php x和y之间的随机数,不包括中间的一系列数字,php,random,Php,Random,我现在正在实施一个系统,它需要为一个人分配一定范围内的号码,但不使用以前使用过的任何号码。 请记住,数字范围和排除列表都将非常大 起初,我认为这样做最好: <?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,

我现在正在实施一个系统,它需要为一个人分配一定范围内的号码,但不使用以前使用过的任何号码。
请记住,数字范围和排除列表都将非常大

起初,我认为这样做最好:

<?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);
?>


所以,我的问题是,哪一个是更好的选择?还有其他(更好的)方法吗?以前有人用过吗?

数组保存大量数据会占用大量内存,您不能使用数据库保存这些数据吗?这就是它们的设计目的。

我就是这么想的。排除的号码在分配后将保存在数据库中。我想原来的范围也可以,但我该如何使用它呢?每个数字存储一行,并带有一个标志,表明是否已排除?考虑到这些数字已经是连续的,存储所有数字肯定是一种浪费?类似于
SELECT。。。如果数字不是按RAND()排序的(4,6,7,8,9,34)
?您仍然可以执行
mt\u RAND
部分,但只需在数据库中查找生成的数字,而不必在数组中执行
。我将有一个只有1个字段的表,这是数字-主键/mediumint。如果您的字段设置正确,那么就不会有那么大的浪费。正确的数据库针对这类内容进行了优化。因此,您是说使用我的第一个解决方案,只需使用sql而不是数组()中的
?多个数据库调用会比使用一个查询将所有被排除的数据存储在一个数组中要好得多吗?对于所有的问题,很抱歉,在我开始之前,我只是想弄清楚。是的,使用第一个解决方案,但使用sql,实际情况下,一次运行需要生成多少个数字?