我正在编写一个“秘密圣诞老人”函数,该函数接受一个名称数组,并将它们与同一数组中的其他名称随机匹配(并且它们自身不能匹配)。
我已经开始工作了,但是现在我需要使它运行两次,以确保该函数运行两次,然后确保没有人连续两年遇到同一个人。为了我自己的生命,我无法让函数运行两次并创建两个单独的输出(console.log除外,但由于我需要比较对我无用的输出进行比较)。
代码:
var family = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh', 'iii']
function secretSanta() {
var yourPick = [];
var receivers = family.slice();
var length = family.length;
for (var i = 0; i < length; i++) {
var giver = family[i];
var receiverIndex = Math.floor(Math.random() * receivers.length);
while (receivers[receiverIndex] === giver) {
receiverIndex = Math.floor(Math.random() * receivers.length);
}
var receiver = receivers.splice(receiverIndex, 1)[0];
yourPick.push({
Giver: giver,
Receiver: receiver
});
}
return yourPick;
}
secretSanta()
我尝试过迭代
for (var i = 1; i < 3; i++) secretSanta(i)
递归
(function repeat(number) {
secretSanta(number);
if (number < 3) repeat(number + 1);
})(1);
和函子应用程序
[1, 2, 3].forEach(secretSanta);
但是我要么无法定义,无限循环,要么“超出最大堆栈大小”
感谢大家的帮助!
答案 0 :(得分:0)
所有可能的不同对,以随机顺序排列。
var family = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh', 'iii']
var pairs = [];
for(let i = 0; i<family.length; i++){
for(let j = i+1; j<family.length; j++){
pairs.push([family[i], family[j]])
}
}
while(pairs.length){
let pair = Math.floor(Math.random() * pairs.length)
let temp = pairs.splice(pair,1);
if(Math.floor(Math.random()*2)) temp[0].reverse()//<-- pair order
console.log(temp[0].join(" - "))
}
一会儿只是随机挑选一对。