首页 > 解决方案 > 如何使用javascript随机生成一对人?

问题描述

我有人员名单,我想将他们配对,而不要重复他们的名字。

这是我的代码:

var people = ['John', 'Jane', 'Harry', 'Mark', 'Steph', 'Mae']
var generatedPairs = [];
var arr1 = people.slice(),
    arr2 = people.slice();
arr1.sort(function() { return 0.5 - Math.random();});
arr2.sort(function() { return 0.5 - Math.random();});

while (arr1.length) {
  let pair = [];
  var name1 = arr1.pop();
  var name2 = arr2[0] == name1 ? arr2.pop() : arr2.shift();
  pair.push({from: name1, to: name2});
  generatedPairs.push(pair);
}

for(let i in generatedPairs) {
    console.log(generatedPairs[i][0].from+' - '+generatedPairs[i][0].to)
}
console.log("=================");

样本结果:

Mae - Jane
Jane - Harry
Steph - Mae
John - Steph
Mark - John
Harry - Mark
=================

该代码运行良好,因为它有偶数人数,即 6。

但是,如果有奇数人(样本 5),则可能有 1 人的名字会重复

var people = ['John', 'Jane', 'Harry', 'Mark', 'Steph']
var generatedPairs = [];
var arr1 = people.slice(),
    arr2 = people.slice();
arr1.sort(function() { return 0.5 - Math.random();});
arr2.sort(function() { return 0.5 - Math.random();});

while (arr1.length) {
  let pair = [];
  var name1 = arr1.pop();
  var name2 = arr2[0] == name1 ? arr2.pop() : arr2.shift();
  pair.push({from: name1, to: name2});
  generatedPairs.push(pair);
}

for(let i in generatedPairs) {
    console.log(generatedPairs[i][0].from+' - '+generatedPairs[i][0].to)
}
console.log("=================");

有时结果会是这样。

Steph - Jane
Jane - John
John - Mark
Mark - Steph
Harry - Harry   <-- this one repeat its name
=================

我该如何处理人数为奇数的情况?我正在为此使用javascript。希望你能帮我解决这个问题。谢谢。

这是我的小提琴-> https://jsfiddle.net/g7xsdnbp/9/

标签: javascript

解决方案


如果我们在数组的长度大于等于 2 时循环,那么当我们不再有足够的空间来制作一对时,无论数组的长度是奇数还是偶数,它都会停止。

我会简单地使用 splice 从数组中删除元素以避免重用元素。除非有令人信服的理由将 2 个副本存储在内存中,否则我也不会使用 2 个不同的数组。

我在下面有一个工作示例:

    let people = ['John', 'Jane', 'Harry', 'Mark', 'Steph', 'Mae', 'Justin']
    let set = new Set();

    while (people.length >= 2){
	    let r1 = Math.random() * people.length;
        let person1 = people.splice(r1, 1)[0];
  
        let r2 = Math.random() * people.length;
        let person2 = people.splice(r2, 1)[0];
  
        set.add({from: person1, to: person2});
        console.log("from: " + person1 + " to: " + person2);
    }

希望这可以帮助!


推荐阅读