Javascript 将数组项连接到唯一关系(JS)
我有一个字符串数组Javascript 将数组项连接到唯一关系(JS),javascript,Javascript,我有一个字符串数组 let people = ['Bill', 'Paul', 'William', 'Francis']; 我想创建随机对: 比尔->保罗 保罗->弗朗西斯 威廉->比尔 弗朗西斯->威廉 所有对必须是唯一的,第二列中的每个名称只能使用一次 这是我的代码,但它没有按预期工作 let receivers = people.sort(function() { return 0.5 - Math.random() }); for (let i in people) {
let people = ['Bill', 'Paul', 'William', 'Francis'];
我想创建随机对:
比尔->保罗
保罗->弗朗西斯
威廉->比尔
弗朗西斯->威廉
所有对必须是唯一的,第二列中的每个名称只能使用一次
这是我的代码,但它没有按预期工作
let receivers = people.sort(function() { return 0.5 - Math.random() });
for (let i in people)
{
console.log(people[i] +' -> '+ receivers[i]);
}
有什么建议吗?取决于你想完成什么。如果您所关心的只是将
人员
随机匹配到接收者
,那么您可以执行以下操作:
for(让我进入接收者){console.log(people[Math.Random()]+'->'+接收者[i]);}
并确保随机值小于数组的大小
但是,如果您想确保people中的每个人都被使用,这是一种糟糕的方法。问题在于
sort
返回原始(但经过修改)数组,而不是新数组
无论如何,您不应该使用排序
来洗牌。这太贵了,而且有失偏颇
您需要一个适当的洗牌实现,然后使用以下方法之一:
let receivers=shuffleInPlace(people.slice());
let receivers=shuffleToNewArray(人);
然后您将能够编写映射:
for(让i=0;i老实说,最简单的解决方案是将数组随机化,然后在其中循环,使每个人成为下一个人的给予者
首先,我们将使用以下技术洗牌阵列:
shuffle(人);
for(设i=0;i${receiver}`);
}
(我假设您很乐意使用ES6,因为您已经使用了let
。从中获取随机数组,并将其与下一个元素进行比较,就像一个圆一样
函数洗牌(数组){
var currentIndex=array.length,temporaryValue,randomIndex;
//虽然还有一些元素需要洗牌。。。
而(0!==currentIndex){
//选择剩余的元素。。。
randomIndex=Math.floor(Math.random()*currentIndex);
currentIndex-=1;
//并将其与当前元素交换。
临时值=数组[currentIndex];
数组[currentIndex]=数组[randomIndex];
数组[randomIndex]=临时值;
}
返回数组;
}
让人们=[‘比尔’、‘保罗’、‘威廉’、‘弗朗西斯’];
洗牌(人);
对于(var i=0;它是鲜为人知的秘密圣诞老人算法?我不知道它有一个名字…谢谢你的建议。永远不要使用0.5-Math.random()
来洗牌数组!!!请参阅
shuffle(people);
for (let i = 0; i < people.length; i++) {
let giver = people[i],
receiver;
if (people[i+1]) {
receiver = people[i+1]
} else {
receiver = people[0]
}
console.log(`${giver} => ${receiver}`);
}