📌  相关文章
📜  javascript 非重复随机化数组 - Javascript (1)

📅  最后修改于: 2023-12-03 15:16:16.485000             🧑  作者: Mango

JavaScript非重复随机化数组

在编程中,我们经常需要将一个数组的元素进行随机排序或随机选择。然而,我们有时需要确保生成的结果是非重复的。本文将介绍如何使用JavaScript生成一个非重复随机化的数组。

方法一:使用Fisher-Yates算法

Fisher-Yates算法是一种常见的用于随机打乱数组元素顺序的算法。我们可以根据这个算法来实现非重复随机化数组的生成。

function shuffle(array) {
  let currentIndex = array.length;
  let temporaryValue, randomIndex;
  
  // 当还有元素没有被随机到之前
  while (currentIndex !== 0) {
    // 随机选择一个剩余的元素
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // 将当前元素与随机选择的元素互换位置
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }
  
  return array;
}

// 用法示例
const originalArray = [1, 2, 3, 4, 5];
const shuffledArray = shuffle(originalArray);

console.log(shuffledArray); // 输出类似 [3, 5, 2, 1, 4]

这段代码首先定义了一个shuffle函数,接收一个数组作为参数。然后,它使用一个while循环来遍历数组中的每一个元素。在每次循环中,它会随机选择一个剩余的元素,并将当前元素与随机选择的元素互换位置。最后返回打乱顺序后的数组。

方法二:使用Set数据结构

另一种方法是使用JavaScript的Set数据结构来确保生成的数组是非重复的。Set数据结构只保存唯一的值,因此我们可以创建一个Set,然后将原始的数组元素逐个添加到Set中。最后,我们可以将Set转换为数组,生成一个非重复随机化的结果。

function shuffleUnique(array) {
  const set = new Set(array);
  const shuffledArray = Array.from(set);
  
  // 使用Fisher-Yates算法再次随机化数组
  let currentIndex = shuffledArray.length;
  let temporaryValue, randomIndex;
  
  while (currentIndex !== 0) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    temporaryValue = shuffledArray[currentIndex];
    shuffledArray[currentIndex] = shuffledArray[randomIndex];
    shuffledArray[randomIndex] = temporaryValue;
  }
  
  return shuffledArray;
}

// 用法示例
const originalArray = [1, 2, 3, 4, 5];
const shuffledArray = shuffleUnique(originalArray);

console.log(shuffledArray); // 输出类似 [4, 3, 1, 2, 5]

这段代码首先使用Set数据结构创建一个包含唯一值的集合。然后,使用Array.from方法将Set转换为数组。最后,我们可以使用上面提到的Fisher-Yates算法再次随机化数组的顺序,并返回结果。

总结

本文介绍了两种JavaScript生成非重复随机化数组的方法。第一种方法是使用Fisher-Yates算法,通过随机交换数组中的元素来打乱顺序。第二种方法是使用Set数据结构,确保生成的数组没有重复的元素。根据实际需求,你可以选择适合自己的方法来生成非重复随机化的数组。

希望本文对你有所帮助!