我正在尝试以随机顺序从数组中访问唯一值对 - 在必要之前不重复自己。
例如,如果我有一个数组集 A、B、C、D(通常为偶数个项目,但最多 20 个),那么第一次我可能会将 A-B 和 C-D 配对。但我想保证,下次我这样做时,我会避免重复配对,并且在再次获得 A-B 和 C-D 之前,我会同时获得 A-C 和 B-D 以及 A-D 和 B-C。每个项目在每轮中只能调用一次。
我首先随机打乱数组的顺序,然后将两个值配对在一起 - 但我需要一种方法来防止某些配对比其他配对更频繁地发生(理想情况下,我希望它们自始至终均等地递增) .
因此,我开始研究排列 - 并设法使用以下代码获得包含所有可能配对的完整数组:
$this->items = array('A','B','C','D');
$input = $this->items;
$input_copy = $input;
$output = array();
$i = 0;
foreach($input as $val) {
$j = 0;
foreach($input_copy as $cval) {
if($j == $i) break;
print $val.'-'.$cval.'<br/>';
//$output[] = array($val => $cval);
$j++;
}
$i++;
}
//print_r($output);
例如,对于 A、B、C、D,我得到:
b-a
c-a
c-b
d-a
d-b
d-c
我想循环遍历集合 n-1 次并捕获另一个数组中的结果,但我不确定如何从这些独特的选项生成实际顺序
换句话说,我想把上面的列表变成下面的:
1st run =>
1=> A-B,
2=> C-D,
2nd run =>
1=> A-C,
2=> B-D,
3rd run =>
1=> A-D,
2=> C-B,
也许我可以通过 $this->items 更简单地做到这一点。我还查看了 Math_Combinatorics PEAR 包,但我不知道从哪里开始。
如果有任何帮助,我将不胜感激!
最佳答案
您可以使用round-robin tournament algorithm
Place elements in two rows.
Fix one element - in this case A
For next round shift all other elements in circular manner.
Pair them.
Repeat N-1 times
A B
D C
-----
A D
C B
----
A C
B D
----
关于php - 从数组中访问唯一值对而无需重复自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436665/