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

Algorithm 从列表中的元素创建所有可能的对,然后对它们进行均匀排序,algorithm,sorting,matching,Algorithm,Sorting,Matching,所以我有3到8名球员,我希望每个人都能和其他人1对1比赛。 每次按顺序进行一次匹配。 一对中的顺序并不重要(a对b==b对a) 我在一个简单的嵌套循环中创建匹配对,在这个循环中我循环玩家并将当前索引与以下所有索引配对 问题是,玩家1将玩他的所有比赛,然后没有什么事可做,而玩家8将不得不等待 有没有办法平均分配这对球员,让所有球员都有相同的休息时间 我目前正在对包含配对的数组进行随机化,但我正在寻找更好的方法。将配对按顺序保存在数组中,然后像这样洗牌 function shuffle(a) { f

所以我有3到8名球员,我希望每个人都能和其他人1对1比赛。 每次按顺序进行一次匹配。 一对中的顺序并不重要(a对b==b对a)

我在一个简单的嵌套循环中创建匹配对,在这个循环中我循环玩家并将当前索引与以下所有索引配对

问题是,玩家1将玩他的所有比赛,然后没有什么事可做,而玩家8将不得不等待

有没有办法平均分配这对球员,让所有球员都有相同的休息时间


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

将配对按顺序保存在数组中,然后像这样洗牌

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);
摘自

您可以使用

“圆”方法是为项目创建明细表的标准算法 循环赛。所有参赛者都分配了号码,并且 然后在第一轮配对:

第一轮。(1局14分,2局13分,…)

然后修复表的第一列或最后一列中的一个参与者(本例中为第一列),然后 将其他部件顺时针旋转一个位置

第二轮。(1局13分,14局12分,…)

第三轮。(第1局第12局,第13局第11局,…)

直到你几乎回到最初的位置

第13轮。(1场比赛2,3场比赛14,…)


@很抱歉,我在第一段中添加了进一步的解释。从问题中可以看出:“我目前正在对包含对的数组进行随机化,但我正在寻找更好的方法。”
 1  2  3  4  5  6  7
14 13 12 11 10  9  8    
 1 14  2  3  4  5  6
13 12 11 10  9  8  7 
 1 13 14  2  3  4  5
12 11 10  9  8  7  6    
 1  3  4  5  6  7  8
 2 14 13 12 11 10  9