javascript - 如何使用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/
解决方案
如果我们在数组的长度大于等于 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);
}
希望这可以帮助!
推荐阅读
- php - 如何在 Laravel 中使用具有不同控制器功能和相同路由的不同表单
- oracle-sqldeveloper - 如何创建 APEX_COLLECTION?
- reactjs - React 项目无法检测到 app.js 文件中的任何更改
- php - 通过 Ajax 发送数据后 PHP 中未定义的变量
- configuration - spring 集成配置日志通道适配器
- android - ClassNotFoundException:找不到类“android.support.v4.util.ArrayMap”
- java - AWS SSM 参数存储未获取所有键/值
- javascript - AureliaJS 测试中的 and 是什么意思?
- entity-framework-6 - postgresql 自定义转换以匹配不同的案例类型
- php - 选择字段中的必需标签不起作用