php数组生成挑战

标签 php arrays multidimensional-array

我需要随机生成一个二维 n × n 数组。在此示例中,n = 10。数组应具有此结构。一个例子:

$igra[]=array(0,1,2,3,4,5,6,7,8,9);
$igra[]=array(6,9,1,5,0,2,7,3,4,8);
$igra[]=array(2,5....................
$igra[]=array(1,7.....................
$igra[]=array(5,4...................
$igra[]=array(4,2...................
$igra[]=array(9,0.....................
$igra[]=array(8,3.....................
$igra[]=array(7,6....................
$igra[]=array(3,8....................

在哪里

`$igra[x][z]!=$igra[y][z]`   (x={0,9},y={0,9});

如您所见,它就像一个数字矩阵,它的每一行和每一列也由数字 0-9 组成,并且在每一行或每一列中从来没有一个数字出现两次。 如何生成这样的数组,并且每次都是随机的。

最佳答案

好的,这是我的版本:

$n = 10;

$v1 = range(0, $n-1);
$v2 = range(0, $n-1);
shuffle($v1);
shuffle($v2);

foreach ($v1 as $x => $value)
    foreach ($v2 as $y)
        $array[$y][$x] = $value++ % $n;

这应该是一个非常快的算法,因为它只涉及生成两个随机数组,根本不涉及任何交换。它也应该是随机的,但我无法证明这一点。 (至少我不知道如何证明这样的事情。)

这是一个非常简单的算法的优化版本:

首先以这种方式创建一个非随机矩阵(假设我们只需要 5*5,而不是 10*10):

0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

在这个矩阵中,我们现在随机交换列。由于我们不更改列本身,因此您的规则仍然得到遵守。然后我们随机交换行。

现在,如您所见,上述算法不会交换任何内容,也不会生成上述矩阵。这是因为它预先生成要交换的列和行($v1$v2),然后直接写入结果数组中的正确位置。

编辑:刚刚做了一些基准测试:$n = 500 需要 0.3 秒。

Edit2:将 for 循环替换为 foreach 循环后,只需 0.2 秒。

关于php数组生成挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274794/

相关文章:

php - 如何在 XP + Apache 2.2 + XDebug 上调试通过 cURL 发送到 Wordpress 的 Atompub POST

c++ - 取消引用一个指向数组类型的结束指针

javascript - 所有图像都会被删除,而不是在reactjs中单击删除图标的特定图像

php - 将 mysqli 准备好的语句的多行结果绑定(bind)到多维数组中

arrays - 有没有办法在 Julia 中旋转 3D 数组?

php - mysql 在同一个查询上有和 where 子句

php - WordPress 网站服务器与大型数据库一起移动问题

php - PHP:-在多维数组中

javascript - 如何在没有 AJAX 的情况下将 JSON 数组发送到服务器

c - 2[p] 和 6[p] 是什么意思?