数组乱序

 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]
posted @ 2020-01-14 10:56  epoch丶  阅读(156)  评论(0编辑  收藏  举报