洗牌算法是將原來的數組進行打散,使原數組的某個數在打散后的數組中的每個位置上等概率的出現。
1、抽牌法,隨機從原數組抽取一個數到新數組中,原數組則刪除抽中的數。
function shuffle_pick(arr){
var len = arr.length;
var arr2 = new Array();
for(var i=len;i>0;i--){
var rand = Math.floor(Math.random()*i);
arr2.push(arr[rand]);
arr.splice(rand,1);
}
return arr2;
}
2、第一種方法的優化,不刪除原數組的數,而是將最后一張未抽取的數放到被抽中的那個空位置。
function shuffle_pick(arr){
var len = arr.length;
var arr2 = new Array();
for(var i=len;i>0;){
var rand = Math.floor(Math.random()*i);
arr2.push(arr[rand]);
arr[rand] = arr[--i];
}
return arr2;
}
3、換牌法,將第i張與隨機位置進行交換,換完一輪即可。
function shuffle_swap(arr){
var len = arr.length;
for(var i=0;i<len;i++){
var rand = Math.floor(Math.random()*(i+1));
[arr[i],arr[rand]] = [arr[rand],arr[i]];
}
return arr;
}