极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。
每天晚上九点 B站讲解前端工程化直播,并解答相关问题。

# 如何实现一个数组洗牌函数 shuffle

更多描述

参考链接:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

// 打乱数组,有可能是 [1, 3, 2, 4],但对原数组没有影响
shuffle([1, 2, 3, 4]);

Issue

欢迎在 Gtihub Issue 中回答此问题: Issue 455 (opens new window)

先来一个利用 Array.prototype.sort 的技巧解法

const shuffle = (list) => list.sort((x, y) => Math.random() - 0.5);

使用以下算法可实现洗牌算法:

  1. 第 N 项数字与前 N 项数字随机选一相互交换
  2. 第 N-1 项数字与前 N-1 项数字随机选一相互交换
  3. ...
  4. 第 2 项数字与前 2 项数字随机选一相互交换

代码调试及测试可见 【Q447】如何实现一个数组洗牌函数 shuffle - codepen (opens new window)

function shuffle(list) {
  const len = list.length;
  let result = [...list];
  for (let i = len - 1; i > 0; i--) {
    const swapIndex = Math.floor(Math.random() * (i + 1));
    [result[i], result[swapIndex]] = [result[swapIndex], result[i]];
  }
  return result;
}
function shuffle(array) {
  let len = array.length;
  let _array = [...array];
  while (len) {
    let index = Math.floor(Math.random() * len--);
    [_array[index], _array[len]] = [_array[len], _array[index]];
  }
  return _array;
}
Last Updated: 11/27/2021, 10:11:48 AM