【算法】Knuth 洗牌算法

适用于打乱一串数组,同时也适用于在数组中随机抽取多个元素不重复

var knuth = (arr)=>{
    var swap = (ar, ia, ib)=>{
        var temp = ar[ia];
        ar[ia] = ar[ib];
        ar[ib] = temp;
    };
    var rand = (a,b)=>{
        return Math.ceil(a) + Math.floor(Math.random() * Math.floor(b-a));
    }
    for(var i = arr.length - 1; i >= 0 ; i -- )
        swap(arr,i, rand(0, i)) // rand(0, i) 生成 [0, i] 之间的随机整数
    return arr;
}
knuth(new Array(8).fill(0).map((item,index)=>index));