<p>这段代码只执行MBo描述的<a href="https://stackoverflow.com/a/66052898/1243641">the algorithm</a></p>
<p/><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">&13;
第13部分,;
<pre class="snippet-code-js lang-js prettyprint-override"><code>const cycle = (n, xs) =>
[... xs .slice (n % xs .length), ... xs .slice (0, n % xs .length)]
const pairs = (xs) =>
xs.length < 2 ? [] : [[xs [0], xs [xs .length - 1]], ...pairs (xs .slice (1, -1))]
const roundRobin = ([x, ...xs]) =>
Array.from(xs, (_, i) => pairs ([x, ...cycle(i, xs)]))
console .log (roundRobin ([1, 2, 3, 4, 5, 6])) //=>
// (1 - 6) & (2 - 5) & (3 - 4)
// (1 - 2) & (3 - 6) & (4 - 5)
// (1 - 3) & (4 - 2) & (5 - 6)
// (1 - 4) & (5 - 3) & (6 - 2)
// (1 - 5) & (6 - 4) & (2 - 3)</code></pre>
;
<pre class="snippet-code-css lang-css prettyprint-override"><code>.as-console-wrapper {max-height: 100% !important; top: 0}</code></pre>
;
</div>和#13;
</div>和#13;
<p><code>cycle</code>只循环数组<code>n</code>个位置,因此,例如,<code>cycle (2, ['a', 'b', 'c', 'd', 'e'])</code>产生<code>['c', 'd', 'e', 'a', 'b']</code><code>pairs</code>将数组两端的两个元素成对放置,然后将它们旁边的两个元素成对放置,以此类推<code>pairs (['a', 'b', 'c', 'd', 'e', 'f'])</code>产生<code>[['a', 'f'], ['b', 'e'], ['c', 'd']]</code></p>
<p>我们在<code>roundRobin</code>中组合这些值,对于每一天,我们移除第一个值,循环剩余的值,将第一个值放回,并将列表变成成对</p>
<p>如果您想要额外的随机性,我建议您在开始之前简单地洗牌数组</p>
<p>如果您希望允许奇数个参与者,每次都有一个坐在外面,我会添加一个专门的坐在外面的参与者,然后每天与不同的参与者配对</p>