我有三个阵列:
$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'
所以再一次,我试图做出随机配对:
$a
中的元素必须恰好匹配3次,$b
或$c
中的元素必须恰好匹配五次,除{编辑!} $c
中的一个元素只能匹配四次。我找到了一个解决方案,通过基本上改组数组并检查它们是否排队,但显然这非常慢 - 需要大约100-5000次尝试才能获得一个有效的解决方案。由于这是为了进行数千次/数百万次的模拟,因此不会削减它。我希望有一种方法可以在第一次尝试时产生这些配对。
答案 0 :(得分:0)
所以使用戴夫的一些建议,我明白了。我确信有一种更简单的方法可以做到,但这是我所做的主旨:
预先准备 - 创建一个数组,其中$b
可与$c
匹配
制作一个包含$b
每个成员五次的数组。
随机播放该阵列,并在第8个成员之后剪切。第一部分进入一个数组,我们称之为$a_choices
。对于我们称之为$b_choices
的第二部分,请致电array_count_values()
并确定每个元素出现的次数。
制作一个包含$c
每个成员五次的数组(除了一个将出现4x的成员),我们称之为$c_list
。然后使用上面的直方图,根据成员出现的次数,从$c
的元素中创建一个数组。例如,如果来自$b
的成员出现3x,3x,4x和2x,那么我需要来自$c
的四个元素:两个出现4x,一个是3x,一个是1x。这些被放入一个数组$c_choices
。元素是从$c_list
中随机挑选的,并从该数组中移出并放入$c_choices
。
调用array_merge($a_choices, $c_list)
合并剩余的内容。现在有{15}个元素可以抓取,$a
和$c
有12个剩余。
首先选择$b
的匹配
$a
中的每个元素,并从$a
中随机选择三个元素。但是,如果任何元素出现太频繁,这次需要抓住它。例如,如果我匹配$a_choices
中的倒数第二个元素,那么我需要从$a
中获取出现两次的任何元素。如果我选择倒数第三个,那么我会抓住任何出现3x的元素。等等。这确保$a_choices
中的最后一个元素可以进行3次唯一匹配。 匹配$a
$b
中的元素,将它们与$b
中的元素匹配,就像我们对来自$c_choices
的元素所做的那样 - 再次确保始终选择出现的任何元素太频繁。预制件部分的重点是确保剩余$a
和$b
剩余元素的正确组合,以使其每次都匹配。