1、随机数(不能完全乱序,性能较低)
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
let arr = [1, 2, 3];
shuffle(arr);
alert(arr);
2、Fisher–Yates shuffle
著名的洗牌算法,原理就是遍历数组元素,将当前元素与随机抽取的一个剩余元素进行交换:
function shuffle(arr) {
for (let i=arr.length-1; i>=0; i--) {
let j= Math.floor(Math.random()*(i+1));
let temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
return arr;
}
shuffle([1,2,3,4,5,6]);//1, 5, 4, 2, 6, 3
3、固定一个值
在乱序的同时,固定一个下标的值,使其位置不变,方法有很多,这里只给出一种:
function shuffle(arr, index) {
let res = [];
// 取固定值
let fix = arr.splice(index, 1)[0];
for (let i=arr.length-1; i>=0; i--) {
let j= Math.floor(Math.random()*(i+1));
res.push(arr[j]);
arr.splice(j, 1);
}
// 将固定值放入指定位置
res.splice(index, 0, fix);
return res;
}
shuffle([1,2,3,4,5,6]