加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php阵列生成挑战

发布时间:2020-12-13 13:11:25 所属栏目:PHP教程 来源:网络整理
导读:我需要随机生成一个二维n×n数组.在此示例中,n = 10.数组应具有此结构.一个例子: $igra[]=array(0,1,2,3,4,5,6,7,8,9);$igra[]=array(6,9,8);$igra[]=array(2,5....................$igra[]=array(1,7.....................$igra[]=array(5,4..............
我需要随机生成一个二维n×n数组.在此示例中,n = 10.数组应具有此结构.一个例子:
$igra[]=array(0,1,2,3,4,5,6,7,8,9);
$igra[]=array(6,9,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

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

现在,正如您所看到的,上述算法不会交换任何内容,也不会生成上述矩阵.那是因为它生成cols和行以提前交换($v1和$v2),然后直接写入结果数组中的正确位置.

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

Edit2:用foreach循环替换for循环后,只需0.2秒.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读