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

时间:2016-06-03 15:40:04

标签: php

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

$exclude = array(4,5,6);

以下代码允许在一个范围内生成随机数,但仅适用于单个数字而不是数字数组

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

5 个答案:

答案 0 :(得分:2)

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

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

while(in_array(($number = rand(1,10)), 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));

以上功能,执行相同的过程,此外,您可以重用代码。它获得最小和最大数量以及要排除的值数组。

最后,

没有循环,但具有递归功能。该函数生成一个随机数,如果在exclude数组中找不到它,则返回:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以使用以下数组函数执行此操作:

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

     return array_shift($range);
}

答案 3 :(得分:0)

前段时间我还想摆脱这些讨厌的小环路。减少以适应您的问题版本,我的方法是:

  • 首先生成一个在(10-3)范围内的随机数,以指示在除{4,5,6}之外的所需范围内的假设数字列表中生成的数字的位置
  • 第二次将此值增加较低范围(1)
  • 对于集合{4,5,6}中的每个数字,第三个增量为1,它等于或更大(按照该集合中从最小到最高的数量顺序)

所以,总而言之,我基本上可以延伸和模糊假设的数字集合,生成的随机值可以适应可能的结果。

答案 4 :(得分:-1)

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