洗牌算法是将原来的数组进行打散,使原数组的某个数在打散后的数组中的每个位置上等概率的出现。
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;
}