js打乱数组顺序 Shuffle

最容易想到的做法
[1,2,3,4,5,6,7].sort(() => Math.random() > .5)
但这个不是真正的乱序,元素大概率还是会留在原本的位置。

最完美的解决办法 -- Fisher–Yates shuffle 洗牌算法
很简单的代码实现

Array.prototype.shuffle = function() {
  let array = this;
  let len = array.length;
  for (let i = len - 1; i > 0; i--) {
    let j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
}

原理如图(图片来自知乎):


js打乱数组顺序 Shuffle_第1张图片

js打乱数组顺序 Shuffle_第2张图片

js打乱数组顺序 Shuffle_第3张图片

首先:从数组末尾开始,随机选择一个元素与其交换位置。
交换后,最后一位固定下来,从倒数第二位开始重复上面的交换。

js打乱数组顺序 Shuffle_第4张图片


以此类推,完成所有交换。

demo地址: https://nowheretorun.github.io/shuffle_sort/

参考链接:
维基百科
知乎

你可能感兴趣的:(js打乱数组顺序 Shuffle)