从给定范围生成唯一的数字集

时间:2019-02-08 13:27:02

标签: php

当前,我正在使用以下脚本从给定范围(在这种情况下为1-20)生成随机数集。但是此代码生成的数字集可能具有多个相同的数字。我需要从给定范围生成唯一的随机集。集合中不得重复任何数字,所有数字应使用一次。

因此,在这种情况下,如果我要设置1-20个范围内的5个数字,则将有4套,每个数字将使用一次。或者,如果我要由4个数字组成的集合,那么将有5个具有唯一随机数的集合。

基本上,我想从给定范围获得具有唯一随机数的所有集合。

如何获得此结果?

管理员注意:我检查了以前的帖子,尽管在各种语言中都有类似的问题,但是在php中没有与此类似的帖子。谢谢。

<form method="POST" action="">
      <label for="Numbers">Numbers</label>
      <input type="checkbox" id="sets" name="sets" value="numbersets"><br />
   <p><input type="submit" value="submit"/></p>
</form>

<?php
function Numbers($min_number, $max_number, $amount_of_numbers)
{
    $range = range($min_number, $max_number);
    shuffle($range);
    $numbers_array = array_slice($range, 0, $amount_of_numbers);
    natsort($numbers_array);
    return array_values($numbers_array);
}

if (isset($_POST['sets'])) {
        echo "<h2>Sets</h2>";
  $number_set = array();
        for ($i = 1; $i <= 4; $i++) { 
            $number_set = Numbers(1, 20, 5);  
            echo implode(",", $number_set) . "<br />";
        }
}


?>

3 个答案:

答案 0 :(得分:4)

使用array_chunk代替array_slice并在函数中准备完整的多维数组。

然后将其传回并回显每个子数组。

function Numbers($min_number, $max_number, $amount_of_numbers)
{
    $range = range($min_number, $max_number);
    shuffle($range);
    $numbers_array = array_chunk($range, $amount_of_numbers);
    foreach($numbers_array as &$arr){
        natsort($arr);
    }
    return array_values($numbers_array);
}


echo "<h2>Sets</h2>\n";
$number_set = Numbers(1, 20, 5);  
foreach($number_set as $set){
    echo implode(",", $set) . "<br />\n";
}

输出(例如,因为它是随机的):

<h2>Sets</h2>
7,10,12,15,16<br />
4,6,8,14,17<br />
1,2,11,13,19<br />
3,5,9,18,20<br />

https://3v4l.org/foqIH

答案 1 :(得分:1)

生成一次随机数组,然后将其切成碎片。

$range = range(1, 20);
shuffle($range);

$number_set = array();
$offset = 0;

for ($i = 1; $i <= 4; $i++) {
    $numbers_array = array_slice($range, $offset, 5);
    natsort($numbers_array);
    $number_set = array_values($numbers_array);
    $offset += 5;
}

答案 2 :(得分:1)

首先生成整个列表然后将其拆分会更容易。

<?php
function Numbers($min_number, $max_number, $number_of_groups)
{
    // +1 needed because (for example) min: 4, max: 5 -> 5 - 4 = 1, but there are 2 possible values, not just 1
    $size_of_set = (int)floor(($max_number - $min_number + 1) / $number_of_groups);

    if ($size_of_set == 0) {
        // Handle corner cases
        // ...
    }

    $range = range($min_number, $max_number);
    shuffle($range);

    $results = array();
    for ($i = 0; $i < $number_of_groups; $i++) {
        $results[$i] = array_slice($range, $i*$size_of_set, $size_of_set);
        natsort($results[$i]);
    }
    return $results;
}

if (isset($_POST['sets'])) {
        echo "<h2>Sets</h2>";
        $number_set = Numbers(1, 20, 4);
        for ($i = 0; $i < sizeof($number_set); $i++) {
            echo implode(",", $number_set[$i]) . "<br />";
        }
}
?>

编辑

刚刚意识到,您不需要在(int)floor(...)处使用$size_of_set = (int)floor(...),因为所有数字都是整数->计算返回的是整数。