javascript - 如何在NodeJS中从一个数组中提取多个项目而不重复?
问题描述
我目前正在编写一个为 Mordhau 随机生成负载的脚本。
我现在不担心它计算点值,但我想这样做,这样它就不会重复任何选定的特权。
我在数组中有特权:
let perks = ["Smith","Wrecker","Scavenger","Cat","Friendly","Tenacious"]; //etc etc
而且,诚然,我选择它们的方式非常笨拙,但它可以完成大部分工作。
let p1 = perks[Math.floor(Math.random()*(perks.length))]; //perk 1
let p2 = perks[Math.floor(Math.random()*(perks.length))]; //perk 2
let p3 = perks[Math.floor(Math.random()*(perks.length))]; //perk 3
有没有一种方法可以分配这些变量(p1,p2,p3),而不会从数组“perks”中的项目中重复?
提前致谢!
解决方案
一种方法是使用生成随机索引,直到从数组中获得 n 个不同的索引:
function getRandomIndexes(arr, indexesCount) {
if (indexesCount > arr.length) {
return [];//Cant extract more items than we have in array.
}
const indexesSet = new Set();
while (indexesSet.size < indexesCount) {
indexesSet.add(Math.floor(Math.random() * arr.length));
}
const op = [];
for (let index of indexesSet) {
op.push(arr[index]);
}
return op;
}
let perks = ["Smith", "Wrecker", "Scavenger", "Cat", "Friendly", "Tenacious"];
let [p1, p2, p3] = getRandomIndexes(perks, 3);
console.log({p1,p2,p3})
注意:
如果arr.length
接近,这种方法可能会很糟糕indexesCount
,在这种情况下,克隆和改组可能是更好的方法,或者不是获取 n 个随机值,而是可以获取arr.length-n
随机值并将它们过滤掉。