今天面试的时候被问到实现乱序数组的最简便的方法,自己只知道使用Math.random()
和结果数组的笨方法…总结一下。
sort()
方法
数组的sort()
方法是按照return
的值的正负来去做排序判定,所以实现的思路可以是使得返回的值随机正负。
function randArr(arr){
return arr.sort(()=>{
return (Math.random()-0.5);
})
}
Math.random()
是生成0.0(包含)~1.0(不包含)之间的随机数。
但这么做是一个伪排序。参考:https://zhuanlan.zhihu.com/p/33260052
有大神做过测试,进行10000次乱序操作后,元素大概率停留在自己的初始位置上。
洗牌算法
思路是:
- 找到数组的最后一个元素
- 从数组开头到最后一个元素之间,找到随机的一个数
- 交换两个元素的位置
- 此时最后一个元素已经是乱序后的结果
- 指向最后一个元素的索引前移
- 直到指向索引为0
//洗牌算法
function randArr3(arr){
var length=arr.length;
var r=length;
var rand=0;
while(r){
rand=Math.floor(Math.random()*(r--));
[arr[r],arr[rand]]=[arr[rand],arr[r]];
}
return arr;
}
Math.random()
+结果数组
function randArr2(arr){
var res=[];
var len=arr.length;
for(var i=0;i<len;++i){
var index=Math.floor(Math.random()*arr.length);
res.push(arr[index]);
arr.splice(index,1);
}
return res;
}