从列表中的元素创建所有可能的对,然后均匀地对它们进行排序

时间:2017-07-06 09:12:14

标签: algorithm sorting matching

所以我有3到8名球员,我希望每个人都能对抗所有其他球员1对1。 匹配按顺序一个一个地完成。 一对中的排序并不重要(a vs b == b vs a)。

我正在一个简单的嵌套循环中创建匹配对,我在其中循环播放器并将当前索引与所有以下索引配对。

问题在于,玩家1将完成所有比赛然后无所事事,而玩家8将不得不等待。

有没有办法均匀分配对,所以所有玩家都有相同的停机时间?

我目前正在随机化包含这些对的数组,但我正在寻找更好的方法。

2 个答案:

答案 0 :(得分:3)

您可以使用Round-robin tournament scheduling algorithm

  

circle方法是为a创建计划的标准算法   循环赛。所有参赛者都被分配到数字,和   然后在第一轮配对:

     

第1轮(1次14次,2次13次,......)

 1  2  3  4  5  6  7
14 13 12 11 10  9  8    
     

然后修复表格的第一列或最后一列中的一个贡献者(本例中为第一列)和   顺时针旋转其他位置

     

第2轮(1次13次,14次12次,......)

 1 14  2  3  4  5  6
13 12 11 10  9  8  7 
     

第3轮(1次12次,13次11次,......)

 1 13 14  2  3  4  5
12 11 10  9  8  7  6    
     

直到你几乎回到初始位置

     

第13轮(1次2次,3次14次,......)

 1  3  4  5  6  7  8
 2 14 13 12 11 10  9

答案 1 :(得分:0)

将比赛按顺序保存在一个数组中,然后按照这样的方式随机播放

function shuffle(a) {
for (let i = a.length; i; i--) {
    let j = Math.floor(Math.random() * i);
    [a[i - 1], a[j]] = [a[j], a[i - 1]];
}

}

然后像这样使用它

var myArray = ['1','2','3','4','5','6','7','8','9'];
shuffle(myArray);

取自Here