Php 如何从一系列数字中随机生成一个数字,但排除一些数字?

Php 如何从一系列数字中随机生成一个数字,但排除一些数字?,php,Php,如何从1到10之间的数字范围生成随机数,同时排除数字数组,例如4、5、6 $exclude = array(4,5,6); 下面的代码允许在一个范围内生成随机数,但是仅针对单个数字,而不是一个数字数组 function randnumber() { do { $numb = rand(1,10); } while ($varr == 4); return $numb; } 创建一个循环,循环直到使用rand函数生成的随机数不在数组中为止。如果在数组中找到生成的数字,则会再次生

如何从1到10之间的数字范围生成随机数,同时排除数字数组,例如4、5、6

$exclude = array(4,5,6);
下面的代码允许在一个范围内生成随机数,但是仅针对单个数字,而不是一个数字数组

function randnumber() {
    do {
    $numb = rand(1,10);
} while ($varr == 4);
return $numb;
}

创建一个循环,循环直到使用rand函数生成的随机数不在数组中为止。如果在数组中找到生成的数字,则会再次生成另一个随机数

do {   
    $number = rand(1,10);
} while(in_array($number, array(4,5,6)));
echo $number;

您也可以像函数一样使用它:

<?php

function randomNo($min,$max,$arr) {
    while(in_array(($number = rand($min,$max)), $arr));
    return $number;
}

echo randomNo(1,10,array(4,5,6));

明智的做法是检查是否排除了所有输入以避免无限循环

您可以使用如下数组函数简单地执行此操作:

function my_rand($min, $max, array $exclude = array())
{
     $range = array_diff(range($min, $max), $exclude);
     array_shuffle($range);

     return array_shift($range);
}

不久前,我还想摆脱这些讨厌的小循环。为了适应您对问题的理解,我的方法是:

首先生成一个范围为10-3的随机数,以指示要生成的数字在所需范围(不包括{4,5,6})内的假想数字列表中的位置 第二次将该值增加下限1 集合{4,5,6}中每一个数的第三个增量为1,从该集合中的最小数到最大数的顺序为等于或更大
因此,总而言之,我基本上会拉伸和模糊假设的一组数字,生成的随机值可以适合可能的结果。

我可以想出至少20种方法。你想快点吗?你在乎它的分布有多均匀吗?它可以使用多少内存?你打算叫它一次还是几千次?我只是个初学者,所以我不太大惊小怪。性能不是问题,也不需要均匀分布。您可以分享您的尝试吗?请仔细阅读,看起来这一条更好:@Don'tPanic谢谢。为什么OP要这么做?一个好的答案总是会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,而且是为了SO的未来访问者。@JayBlanchard,我认为,在这种情况下,函数逻辑非常简单和透明。我看不出有什么理由评论这段代码。如果你有不同的想法,请编辑帖子并添加解释。正如我之前所说,SO的未来访问者可能会对你所说的内容感到迷茫,也许他们是对编码一无所知的新手,而你的答案,就目前而言,对他们没有帮助。想象一下,在你开始编写代码的前几天,你的答案对你来说是否同样透明?我会让你自己编辑你的帖子。
function randomExclude($min, $max, $exclude = array()) {
    $number = rand($min, $max);
    return in_array($number, $exclude) ? randomExclude($min, $max, $exclude) : $number;
}

echo randomExclude(1,10,array(4,5,6));
<?php
$exclude = array(4,5,6); // The integers to excluded
do
{
   $x = rand(1, 10); // Generate a random integer between 1 and 10
}while(in_array($x, $exclude)); // If we hit something to exclude, try again
echo $x; // A random integer not excluded
?>
function my_rand($min, $max, array $exclude = array())
{
     $range = array_diff(range($min, $max), $exclude);
     array_shuffle($range);

     return array_shift($range);
}
$total = range(0,10);
$exclude = range(4,6);
$include = array_diff($total, $exclude);
print_r (array_rand($include));