如何快速让一个数组乱序,写出来

在前端 JavaScript 中,快速打乱数组顺序最常用的方法是使用 sort 方法结合一个随机比较函数:

function shuffleArray(array) {
  return array.sort(() => Math.random() - 0.5);
}

// 示例用法:
let myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let shuffledArray = shuffleArray(myArray);
console.log(shuffledArray); // 输出乱序后的数组

解释:

  • array.sort() 方法默认会按升序排列数组元素。
  • 通过传入一个比较函数,我们可以自定义排序逻辑。
  • Math.random() - 0.5 会生成一个介于 -0.5 和 0.5 之间的随机数。
  • 如果比较函数返回一个负数,sort 方法会将第一个元素排在第二个元素之前;如果返回正数,则将第二个元素排在第一个元素之前;如果返回 0,则保持两个元素的相对顺序不变。
  • 由于 Math.random() - 0.5 的结果是随机的,因此 sort 方法会以随机的顺序排列数组元素,从而实现乱序效果。

注意事项:

  • 虽然这种方法很简洁常用,但它并非真正的随机乱序,因为 sort() 方法的底层实现可能会影响随机性,导致某些排列出现的概率更高。对于需要更严格随机性的场景,建议使用 Fisher-Yates 洗牌算法。
  • 该方法会直接修改原数组。如果需要保留原数组,需要先创建一个副本:
let myArray = [1, 2, 3, 4, 5];
let shuffledArray = shuffleArray([...myArray]); // 使用扩展运算符创建副本
console.log(myArray); // 原数组保持不变
console.log(shuffledArray); // 乱序后的数组

Fisher-Yates 洗牌算法 (更均匀的随机性):

function fisherYatesShuffle(array) {
  let currentIndex = array.length,  randomIndex;

  // While there remain elements to shuffle.
  while (currentIndex != 0) {

    // Pick a remaining element.
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex--;

    // And swap it with the current element.
    [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
  }
  return array;
}

let myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let shuffledArray = fisherYatesShuffle(myArray);
console.log(shuffledArray);

Fisher-Yates 洗牌算法能保证每个元素在每个位置出现的概率相等,因此能产生更均匀的随机排列。 如果对随机性要求较高,建议使用 Fisher-Yates 洗牌算法。

posted @ 2024-11-21 12:33  王铁柱6  阅读(186)  评论(0)    收藏  举报