当前,我正在使用以下脚本从给定范围(在这种情况下为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 />";
}
}
?>
答案 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 />
答案 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(...)
,因为所有数字都是整数->计算返回的是整数。