在PHP中有效地创建满足特定条件的随机数组项

时间:2013-08-10 21:07:31

标签: php

我有三个阵列:

$a有五个元素,$b& c有四个要素。

$a的每位成员必须与$b$c成员一起随机配对三次。但是,$b$c中的每个元素必须与其他两个数组中的五个元素随机配对。

这些配对中的每一个都必须是唯一的,并且元素不能与自身配对。

例如:

$a = array('a1', 'a2', 'a3', 'a4', 'a5');
$b = array('b1', 'b2', 'b3', 'b4');
$c = array('c1', 'c2', 'c3', 'c4');

a1的配对可能如下:

'a1', 'b3'
'a1', 'b4'
'a1', 'c2'

c3的配对看起来像

'c3', 'a2'
'c3', 'b3'
'c3', 'a4'

所以再一次,我试图做出随机配对:

  1. 元素必须与其他数组中的元素匹配(因此它们不能匹配)。它们可以是任何一个。
  2. 每个匹配必须是唯一的
  3. $a中的元素必须恰好匹配3次,$b$c中的元素必须恰好匹配五次,除{编辑!} $c中的一个元素只能匹配四次。
  4. 我找到了一个解决方案,通过基本上改组数组并检查它们是否排队,但显然这非常慢 - 需要大约100-5000次尝试才能获得一个有效的解决方案。由于这是为了进行数千次/数百万次的模拟,因此不会削减它。我希望有一种方法可以在第一次尝试时产生这些配对。

1 个答案:

答案 0 :(得分:0)

所以使用戴夫的一些建议,我明白了。我确信有一种更简单的方法可以做到,但这是我所做的主旨:

预先准备 - 创建一个数组,其中$b可与$c 匹配

  1. 制作一个包含$b每个成员五次的数组。

  2. 随机播放该阵列,并在第8个成员之后剪切。第一部分进入一个数组,我们称之为$a_choices。对于我们称之为$b_choices的第二部分,请致电array_count_values()并确定每个元素出现的次数。

  3. 制作一个包含$c每个成员五次的数组(除了一个将出现4x的成员),我们称之为$c_list。然后使用上面的直方图,根据成员出现的次数,从$c的元素中创建一个数组。例如,如果来自$b的成员出现3x,3x,4x和2x,那么我需要来自$c的四个元素:两个出现4x,一个是3x,一个是1x。这些被放入一个数组$c_choices。元素是从$c_list中随机挑选的,并从该数组中移出并放入$c_choices

  4. 调用array_merge($a_choices, $c_list)合并剩余的内容。现在有{15}个元素可以抓取,$a$c有12个剩余。

  5. 首先选择$b的匹配

    1. 浏览$a中的每个元素,并从$a中随机选择三个元素。但是,如果任何元素出现太频繁,这次需要抓住它。例如,如果我匹配$a_choices中的倒数第二个元素,那么我需要从$a中获取出现两次的任何元素。如果我选择倒数第三个,那么我会抓住任何出现3x的元素。等等。这确保$a_choices中的最后一个元素可以进行3次唯一匹配。
    2. 匹配$a

      1. 现在使用$b中的元素,将它们与$b中的元素匹配,就像我们对来自$c_choices的元素所做的那样 - 再次确保始终选择出现的任何元素太频繁。预制件部分的重点是确保剩余$a$b剩余元素的正确组合,以使其每次都匹配。