js 乱序数组三种方法

今天面试的时候被问到实现乱序数组的最简便的方法,自己只知道使用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值