Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript随机生成一对人?_Javascript - Fatal编程技术网

如何使用javascript随机生成一对人?

如何使用javascript随机生成一对人?,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()

我有一张名单,我想把他们配对,不要重复他们的名字

这是我的密码:

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),可能会有一个人的名字会重复

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
=================
Steph-Jane
简-约翰
约翰-马克
马克·斯蒂芬

Harry-Harry如果我们在数组长度大于等于2时循环,那么无论数组长度是奇数还是偶数,当我们不再有足够的时间进行配对时,循环将停止

我只需要使用splice从数组中删除元素,以避免重用元素。我也不会使用2个不同的阵列,除非有令人信服的理由在内存中存储2个拷贝

我有一个工作示例如下:

let people=['John','Jane','Harry','Mark','Steph','Mae','Justin']
设集合=新集合();
而(people.length>=2){
设r1=Math.random()*people.length;
设person1=people.splice(r1,1)[0];
设r2=Math.random()*people.length;
设person2=people.splice(r2,1)[0];
add({from:person1,to:person2});
控制台日志(“从:“+person1+”到:“+person2”);

}
这里有一个可能的解决方案:

  • ((people.length-1)*people.length)/2给出了可能的不同对(不考虑顺序)和不同名称的数量“约翰-简”和“简-约翰”算作一个

  • 我们可以使用嵌套的
    for循环
    ,获得所有唯一的组合(不考虑此处的顺序),但第二个循环使用
    j=i+1
    ,以避免重复同一个人

  • 然后我们选择一个随机配对,并使用随机配对来决定配对的顺序。然后我们调整数组,使其不选择同一对

  • 因此,我们以随机顺序得到所有可能的对组合

let people=['John','Jane','Harry','Mark','Steph']
var对=[];

对于(i=0;i),在这种情况下,你想做什么?当简已经与斯蒂芬匹配时,会允许哈利与简匹配吗?如果不会,那么会允许哈利与简匹配吗?不,可能会有这样的结果(斯蒂芬-哈里)(马克-约翰),(哈里-简),(约翰-马克),(简-斯蒂芬)他们是5个人(奇数)但是,他们没有一个人重复这些名字,这就是我想要达到的目标,名字不能在一对中重复?或者,他们不能在任何一对中的位置1重复?或者在任何一对中的位置2重复?请澄清。名字不能在一对中重复自己,也不能在任何一对中的位置1和2重复,就像在正常的一对中一样。你知道吗ke sense?嗨,Hans。请不要链接到第三方网站来显示您的工作代码,因为这些链接可能会随着时间的推移而消失。只需插入“代码片段”(在撰写答案时看到的工具栏中)你的答案,就在这里,就像我为你做的一样。嗯。你必须为7个人生成7对匹配。你为7个人生成了3对匹配。看看问题中的例子。啊,在发帖时不清楚。听起来好像名字在这对人的任何位置都不能重复。没问题。继续尝试。:)就像《秘密圣诞老人对》,你们知道吗?