解决此问题的一种方法是简单地生成所需的范围$arr = range(1, 100),然后将其随机化以随机化shuffle($arr),然后将其分块以获得5个$sets = array_chunk($arr, 5)的集合。
所以最后的答案:
$arr = range(1, 100); // gives us an array of 100 integers 1-100
shuffle($arr); // randomly orders those integers
$sets = array_chunk($arr, 5); // creats an array of arrays of sets of 5 integers
foreach ($sets as $set) {
echo implode(',', $set), "\n";
}
给你类似的东西......
14,24,60,95,86
47,54,10,77,3
11,22,88,80,39
72,46,81,78,59
63,98,52,82,8
79,34,43,13,41
67,33,75,1,2
4,57,84,73,17
32,55,35,18,70
64,85,100,93,71
25,19,26,20,76
99,89,7,87,91
37,97,68,27,5
74,48,65,61,58
45,31,9,30,21
16,56,50,96,90
92,40,6,44,23
28,94,38,83,29
36,62,51,66,15
12,69,49,42,53
替代实现
解决此问题的另一种方法是使用哈希集跟踪所有随机生成的整数以防止重复,这种方法不需要一次将整个数组写入内存然后随机使用它。这给了我们相同的确切结果,除了我们在一个步骤中而不是两个步骤中完成随机数生成和排序。您甚至可以通过这种方式在同一步骤中进行分块。
但请记住,该解决方案在技术上较慢,因为它处于无限时间(我们必须不断猜测该数字是否已经存在)。
我将使用生成器来实现这个解决方案,因为它比Iterator 模式更容易编写。
function randomizeIntegerXRangeChunked($start, $end, $chunks = 5): Generator
{
$inSet = []; // track the integers already in the set
for ($i = $start, $c = 0; $i <= $end; $i++) {
/* solution is in unbounded time */
while (isset($inSet[($n = mt_rand($start, $end))]));
$inSet[$n] = true;
yield $c => $n;
if (!($i % $chunks)) {
$c++;
}
}
}
$arr = [];
foreach (randomizeIntegerXRangeChunked(1, 100, 5) as $chunk => $int) {
$arr[$chunk][] = $int;
}
var_dump($arr);
输出将类似于...
数组(20){
[0]=>
数组(5){
[0]=>
整数(43)
[1]=>
整数(52)
[2]=>
整数(38)
[3]=>
整数(73)
[4]=>
整数(55)
}
[1]=>
数组(5){
[0]=>
整数(59)
[1]=>
整数(3)
[2]=>
整数(71)
[3]=>
整数(47)
[4]=>
整数(50)
}
[2]=>
数组(5){
[0]=>
整数(54)
[1]=>
整数(19)
[2]=>
整数(60)
[3]=>
整数(40)
[4]=>
整数(5)
}
[3]=>
数组(5){
[0]=>
整数(26)
[1]=>
整数(46)
[2]=>
整数(93)
[3]=>
整数(80)
[4]=>
整数(63)
}
[4]=>
数组(5){
[0]=>
整数(18)
[1]=>
整数(45)
[2]=>
整数(98)
[3]=>
整数(1)
[4]=>
整数(72)
}
[5]=>
数组(5){
[0]=>
整数(37)
[1]=>
整数(97)
[2]=>
整数(15)
[3]=>
整数(68)
[4]=>
整数(8)
}
[6]=>
数组(5){
[0]=>
整数(34)
[1]=>
整数(14)
[2]=>
整数(33)
[3]=>
整数(24)
[4]=>
整数(65)
}
[7]=>
数组(5){
[0]=>
整数(4)
[1]=>
整数(16)
[2]=>
整数(13)
[3]=>
整数(41)
[4]=>
整数(86)
}
[8]=>
数组(5){
[0]=>
整数(95)
[1]=>
整数(12)
[2]=>
整数(44)
[3]=>
整数(66)
[4]=>
整数(83)
}
[9]=>
数组(5){
[0]=>
整数(67)
[1]=>
整数(48)
[2]=>
整数(91)
[3]=>
整数(27)
[4]=>
整数(79)
}
[10]=>
数组(5){
[0]=>
整数(56)
[1]=>
整数(25)
[2]=>
整数(2)
[3]=>
整数(64)
[4]=>
整数(78)
}
[11]=>
数组(5){
[0]=>
整数(57)
[1]=>
整数(17)
[2]=>
整数(74)
[3]=>
整数(42)
[4]=>
整数(69)
}
[12]=>
数组(5){
[0]=>
整数(96)
[1]=>
整数(20)
[2]=>
整数(9)
[3]=>
整数(28)
[4]=>
整数(7)
}
[13]=>
数组(5){
[0]=>
整数(30)
[1]=>
整数(75)
[2]=>
整数(21)
[3]=>
整数(6)
[4]=>
整数(89)
}
[14]=>
数组(5){
[0]=>
整数(51)
[1]=>
整数(36)
[2]=>
整数(62)
[3]=>
整数(58)
[4]=>
整数(23)
}
[15]=>
数组(5){
[0]=>
整数(85)
[1]=>
整数(32)
[2]=>
整数(100)
[3]=>
整数(61)
[4]=>
整数(49)
}
[16]=>
数组(5){
[0]=>
整数(39)
[1]=>
整数(87)
[2]=>
整数(76)
[3]=>
整数(70)
[4]=>
整数(22)
}
[17]=>
数组(5){
[0]=>
整数(88)
[1]=>
整数(77)
[2]=>
整数(10)
[3]=>
整数(99)
[4]=>
整数(53)
}
[18]=>
数组(5){
[0]=>
整数(94)
[1]=>
整数(35)
[2]=>
整数(92)
[3]=>
整数(90)
[4]=>
整数(84)
}
[19]=>
数组(5){
[0]=>
整数(81)
[1]=>
整数(82)
[2]=>
整数(31)
[3]=>
整数(29)
[4]=>
整数(11)
}
}