消除随机矩阵中的重复

时间:2012-01-24 04:47:01

标签: php random non-repetitive

我正在编写一个程序,涉及将一个数字放入7x7网格的每个单元格中。有56个数字,随机选择,不得重复。

最终结果应该是7x7网格,其中每个单元格包含1到56之间的整数,没有两个单元格包含相同的数字。这样做最有效的方法是什么?

额外的话: 我尝试创建一个for x {for y {}},它将逐个单元格通过网格,并添加一个随机数1-56。然后,它将检查56个插槽的数组以查看该数字是否已被使用,并相应地重新滚动或接受该数字,然后标记该数组以将该数字标记为正在使用。出于某种原因,我无法让它工作,这似乎是一个糟糕的解决方案。我取消了它,而是每次运行x {for y {}}运行一秒钟,并在批准或拒绝之前逐个单元格检查整个网格单元格。这也没有用,而且看起来很笨拙,所以我也把它废弃了。

4 个答案:

答案 0 :(得分:1)

  1. 创建一个长度为56的数组,填充数字1到56

  2. 使用Fisher-Yates shuffle创建一个无偏的随机数组

  3. 从数组中依次填充7x7矩阵(行或列顺序)。

答案 1 :(得分:1)

您可以生成1:56的数组,然后随机播放,然后选出前49个元素。

$arr = range(1,56);
shuffle($arr);
$vals = array_slice($arr, 0, 49); //49 because grid is 7x7

// put $vals in grid.

答案 2 :(得分:0)

  • 创建一个包含数字1到56的56个元素的数组。
  • 生成1到数组长度的随机数
  • 选择该索引处的数字并将其从数组中删除
  • 泡沫,冲洗,重复

答案 3 :(得分:0)

创建一个包含所有需要的数字的数组,并将其随机播放。

$fullGrid = range($min, $max);
shuffle($fullGrid);

现在您需要做的只是直观地显示$fullGrid数组。

More on the php shuffle function.