PHP生成符合规则的18行9列随机矩阵问题求助
解决18行9列每行5个数字的随机表格生成问题
需求规则
- 生成18行9列的表格
- 每行必须恰好包含5个数字
- 列数字范围:第1列1-10,第2列11-20,…,第9列81-90,表格内无重复数字
- 刷新页面时数字位置随机更新
原代码问题分析
原getAllColumnIndexes函数逻辑存在漏洞:在为每列挑选10个行号时,通过随机尝试并限制每行最多5个数字的方式,可能出现剩余可选行不足以填满当前列10个位置的情况,导致部分列的行号数量不足10,最终造成某些行的数字数量达不到5个。
修正方案
换用更可靠的逻辑:先确保每行恰好选中5个列,再验证各列选中次数是否为10(18×5=90,9×10=90,刚好平衡),最后填充对应数字。
<?php // 初始化18行9列的标记矩阵,true表示该位置要填充数字 $grid = array_fill(1, 18, array_fill(1, 9, false)); // 为每行随机选择5个不同的列进行标记,同时确保每列恰好被选中10次 $columnCounts = array_fill(1, 9, 0); $valid = false; // 循环直到生成符合列计数要求的矩阵 while (!$valid) { // 重置标记和计数 $grid = array_fill(1, 18, array_fill(1, 9, false)); $columnCounts = array_fill(1, 9, 0); foreach ($grid as $row => &$cols) { // 随机选5个不重复的列号 $selectedCols = array_rand(range(1,9), 5); // 兼容PHP版本差异,确保返回数组 if (!is_array($selectedCols)) { $selectedCols = [$selectedCols]; } foreach ($selectedCols as $col) { $cols[$col] = true; $columnCounts[$col]++; } } // 检查所有列的计数是否都是10 $valid = true; foreach ($columnCounts as $count) { if ($count !== 10) { $valid = false; break; } } } // 为每个列生成对应范围的随机不重复数字 $numberList = []; $startVal = 1; for ($i = 1; $i <= 9; $i++) { $numbers = range($startVal, $startVal + 9); shuffle($numbers); $numberList[$i] = $numbers; $startVal += 10; } ?> <table> <?php foreach ($grid as $row => $cols) { echo '<tr class="active">'; foreach ($cols as $col => $shouldFill) { $num = ''; if ($shouldFill) { // 取出对应列的下一个数字 $num = array_shift($numberList[$col]); } echo "<td>{$num}</td>"; } echo '</tr>'; } ?> </table>
代码说明
- 矩阵标记:创建18×9的矩阵,为每行随机选5个列标记为填充位,确保每行必有5个数字。
- 校验平衡:检查每个列被标记的次数是否为10,总填充位为90个,9列各10个刚好匹配,不满足则重新生成。
- 数字填充:为每个列生成对应范围的随机数字数组,遍历矩阵填充标记位置的数字,确保无重复。
内容的提问来源于stack exchange,提问作者MWT bro
相关产品推荐
相关产品推荐

