随机排序四种方法

随机排序四种方法

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

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

猜你喜欢

转载自www.cnblogs.com/xiaojianwei/p/10132426.html