随机排序四种方法

随机排序四种方法

方法一: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))
}

原理:洗牌算法就是将循环的数保存下来,保存下来后就随机产生一个数,将随机产生的数赋值给前面保存的数,然后再讲前面保存的数给当前随机产生的数,最后直到将数组的长度循环完。

转载于:https://www.cnblogs.com/xiaojianwei/p/10132426.html

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值