最容易想到的做法
[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]];
}
}
原理如图(图片来自知乎):
首先:从数组末尾开始,随机选择一个元素与其交换位置。
交换后,最后一位固定下来,从倒数第二位开始重复上面的交换。
以此类推,完成所有交换。