实现方式
function shuffle(arr) {
let newArr = arr;
for (let i = newArr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[newArr[i], newArr[j]] = [newArr[j], newArr[i]];
}
return newArr;
}
// test code
const a = [1,2,3,4,3,6,7,8,9,10,11];
console.log(shuffle(a));
算法分析
给定一个数组,从最后一个数字往前遍历,在遍历到某个元素时,假设index为i,那么取一个index是随机数 [0, i]的值进行调换。
此时取这个随机数的index方法就是Math.floor(Math.random() * (i + 1));
Math.floor: 取整数部分
Math.random: 取值范围时[0, 1)
所以最小是0,最大取到i,也就是不调整。