Php 从特定范围生成x个随机数,该范围不';不重复且不在数组中

Php 从特定范围生成x个随机数,该范围不';不重复且不在数组中,php,Php,如何生成数字列表(18个数字),这些数字的范围从1开始到36结束(包括1和36),生成的数字必须与数组中存在的数字不同 例如: 数组编号:27,31,18,4,15,6 我需要输出18个随机数,它们不在上面的数组中,并且这些数字不能重复 我应该得到的输出:17,21,14,28,7,8,12,20,3,5,16,2,36,11,26,13,24,35 函数randomGen($min、$max、$quantity){ $exluding_数组=[1,2,3,4,5,6,7,8,9,10]; $n

如何生成数字列表(18个数字),这些数字的范围从1开始到36结束(包括1和36),生成的数字必须与数组中存在的数字不同

例如: 数组编号:27,31,18,4,15,6

我需要输出18个随机数,它们不在上面的数组中,并且这些数字不能重复

我应该得到的输出:17,21,14,28,7,8,12,20,3,5,16,2,36,11,26,13,24,35

函数randomGen($min、$max、$quantity){
$exluding_数组=[1,2,3,4,5,6,7,8,9,10];
$numbers=范围($min,$max);
洗牌(数字);
if(范围($min,$max)==$exluding\u数组){
返回“否”;
}否则{
返回数组_切片($numbers,0,$quantity);
}
}
使用此代码,我可以获得不重复的随机数,但返回的数字可以是
排除\u数组
中的数字。在切片之前,您可以使用此代码从生成的
数字中删除
排除\u数组
的所有数字:

函数randomGen($min、$max、$quantity){
$不包括_数组=[1,2,3,4,5,6,7,8,9,10];
$numbers=范围($min,$max);
//删除不需要的号码
$numbers=array_diff($numbers$,不包括数组);
洗牌(数字);
如果(计数($数字)<$数量){
返回“否”;
}否则{
返回数组_切片($numbers,0,$quantity);
}
}
注意:我还改进了您的理智检查,尽管在这种情况下返回“否”似乎不是最好的解决方案。您可能希望抛出一个异常,如vivek_23所示


()

另一种方法是,您可以使用$excluding数组检查$numbers中是否存在这些数字。如果我们找到它们,我们会跳过它们,否则我们会将其包含在最终数组中

如果我们不能生成与
$quantity
一样多的数字,我们还可以抛出
异常

<?php

function randomGen($min, $max, $quantity) {
    $exluding_array = [1,2,3,4,5,6,7,8,9,10];
    $exluding_array = array_flip($exluding_array);
    $numbers = range($min, $max);
    shuffle($numbers);
    $filtered_numbers = [];
    foreach($numbers as $curr_number){
        if(isset($exluding_array[$curr_number])) continue;
        $filtered_numbers[] = $curr_number;
    }

    if(count($filtered_numbers) < $quantity) throw new Exception("Can't generate numbers with the given quantity and range.");

    return array_slice($filtered_numbers, 0, $quantity);
}


print_r(randomGen(1,36,10));
我会利用过滤掉排除的数字:

function randomGen(int $min, int $max, int $quantity, array $excluded = []): array
{
  $result = array_filter(range($min, $max), static function ($val) use ($excluded) {
    return !in_array($val, $excluded, true);
  });
  shuffle($result);
  return array_slice($result, 0, $quantity);
}

$result = randomGen(1, 36, 10, range(1, 10));

演示:

但是输出的数字可以是字符串中的数字”是什么意思?我的意思是,我得到的数字不应该是数组中的数字,对不起,我的英语不好,希望你现在能理解。谢谢你的暗示!如果计数($number)<$quantity?