📌  相关文章
📜  javascript 从数组中获取 n 个随机元素 - Javascript (1)

📅  最后修改于: 2023-12-03 14:42:30.998000             🧑  作者: Mango

JavaScript 从数组中获取 n 个随机元素

在 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 个随机元素的实现方法。