作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 js 制作一个小脚本,其中包含一个用户列表,一个用户必须向另一个用户赠送礼物。
通过应用以下约束:
如果“a”是圣诞老人并向“c”送礼物,则反之亦然。所以“c”不可能是“a”的圣诞老人。
它必须同时适用于偶数和奇数用户。
您认为,尝试最小化比较次数(即加快脚本速度)的正确方法是什么。
我在想这样的事情开始,但后来我不知道如何继续:
let name = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
let a = [...name];
let group1 = [];
let groupSanta = [];
let groupUser = [];
for (var i = 0; i < name.length / 2 - 1; i++) {
let santaClaus = a[Math.floor(Math.random() * a.length)];
a = a.filter(item => item !== santaClaus);
let user = a[Math.floor(Math.random() * a.length)];
a = a.filter(item => item !== user);
group1.push({ santaClaus, user });
}
console.log(a, group1);
最佳答案
您可以对数组进行随机排序,并将每个人分配给下一个人。然后将第一个人分配给数组中的最后一个
// Define names
const names = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// Function to shuffle array
const shuffle = (arr) => {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
const randomNames = shuffle(names);
// Match each person with the next one, folding over at the end
const matches = randomNames.map((name, index) => {
return {
santa: name,
receiver: randomNames[index + 1] || randomNames[0],
}
});
console.log(matches);
关于javascript - JS secret 圣诞老人算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70262468/
我的 friend 邀请我回家玩 secret 圣诞老人游戏,我们应该在那里抽签并为小组中的 friend 扮演“圣诞老人”的角色。 所以,我们写下我们所有的名字并随机选择一个名字。如果我们中的任何一
我是一名优秀的程序员,十分优秀!