1. 程式人生 > >隨機排序四種方法

隨機排序四種方法

隨機排序四種方法

方法一:sort

var arr=[1,3,4,6,8,9,7];
function foo(arr){
    var cloneArr=arr.concat();//拷貝陣列
    cloneArr.sort(()=>{
        return Math.random()-0.5;//獲取-0.5 - 0.5的隨機數
    })
    return cloneArr; //返回排序後的值
}
for(var i=0;i<10;i++){
    console.log(foo(arr))
}

注:由於此方法實現之後的概率不相同,所以不推薦使用

原理:因為sort排序方法是通過回撥函式的返回值來進行排序的,1是升序,-1是降序,而隨機數的取值範圍是0-1,所以我們將隨機數-0.5,就可以得到隨機的正負數。但是由於此方法是兩個相鄰的數進行比較,所以到後面比較的數越小,出現到概率就越大,所以概率不相同。

方法二:遞迴

var arr=[1,3,5,6,7,9,8];
function foo(arr){
    var cloneArr=arr.concat();//拷貝陣列
    var result=[];
    (function(){
        if(!cloneArr.length){return;}
        var index=Math.floor(Math.random()*cloneArr.length) //得到從0到cloneArr.length的隨機數
        result.push(...cloneArr.splice(index,1));
        arguments.callee();
    })()
    
    return result;
}
for(var i=0;i<10;i++){
    console.log(foo(arr))
}

原理:通過隨機數隨機產生陣列的下標,然後通過splice擷取當前隨機的數放入新陣列中,只要克隆的陣列沒有被擷取完,使用arguments.callee()進行自調。

方法三:迭代

var arr=[1,3,5,6,7,9,8];
function foo(arr){
    var cloneArr=arr.concat();//拷貝陣列
    var result=[];
    var len=cloneArr.length;
    for(var i=0;i<len;i++){
        var index=Math.floor(Math.random()*cloneArr.length);
        result=result.concat(cloneArr[index]);
    }
    return result;
}
for(var i=0;i<10;i++){
    console.log(foo(arr))
}

原理:迴圈生成隨機數,每生成一次隨機數就作為下標,將原數拼接到新陣列中去。直到原陣列為空。

方法四:洗牌演算法

var arr=[1,3,5,6,7,9,8];
function foo(arr){
    var cloneArr=arr.concat();//拷貝陣列
    var result=[];
    var len=cloneArr.length;
    for(var i=0;i<len;i++){
        var index=Math.floor(Math.random()*cloneArr.length);
        var temp=cloneArr[i];
        cloneArr[i]=cloneArr[index];
        cloneArr[index]=temp;
    }
    return cloneArr;
}
for(var i=0;i<10;i++){
    console.log(foo(arr))
}

原理:洗牌演算法就是將迴圈的數儲存下來,儲存下來後就隨機產生一個數,將隨機產生的數賦值給前面儲存的數,然後再講前面儲存的數給當前隨機產生的數,最後直到將陣列的長度迴圈完。