📅  最后修改于: 2023-12-03 14:42:30.998000             🧑  作者: Mango
在 JavaScript 中,要从一个数组中随机获取 n 个元素,我们可以使用 Math.random() 函数来生成一个随机数,然后使用这个随机数来获取数组中的随机元素。以下是一个实现示例:
function getRandomElementsFromArray(arr, n) {
if (n >= arr.length) {
return arr;
}
const shuffled = arr.slice();
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
}
return shuffled.slice(0, n);
}
const arr = [1, 2, 3, 4, 5];
const n = 3;
const randomElements = getRandomElementsFromArray(arr, n);
console.log(randomElements); // [2, 4, 1], [5, 2, 1], [3, 5, 1], ...
上述代码中,我们首先判断获取的随机元素数量是否大于等于数组长度,如果是,直接返回整个数组。然后使用数组的 .slice() 方法来创建一个新数组,然后进行 Fisher–Yates 洗牌算法,将这个新数组随机排序。最后使用 .slice() 方法获取指定数量的元素返回即可。
如果希望随机获取的元素不能重复,可以使用 Set 类型来存储随机元素,直到 Set 的大小达到所需数量为止。
function getRandomElementsFromArrayWithoutDuplicates(arr, n) {
if (n >= arr.length) {
return arr;
}
const shuffled = arr.slice();
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
}
const result = new Set();
while (result.size < n) {
result.add(shuffled.pop());
}
return [...result];
}
const arr = [1, 2, 3, 4, 5];
const n = 3;
const randomElementsWithoutDuplicates = getRandomElementsFromArrayWithoutDuplicates(arr, n);
console.log(randomElementsWithoutDuplicates); // [5, 2, 1], [4, 2, 1], [5, 3, 2], ...
上述代码中,在随机排序数组的基础上,使用 Set 来存储随机元素,直到 Set 的大小达到所需数量为止。最后使用 Array.from() 或 ... 运算符将 Set 转换成数组返回即可。
以上是 JavaScript 从数组中获取 n 个随机元素的实现方法。