zoukankan      html  css  js  c++  java
  • 随机排序四种方法

    随机排序四种方法

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

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

  • 相关阅读:
    until循环
    linux的shell使用
    shell通配符(元字符)
    linu运算
    mail邮件
    linux命令
    redis笔记
    mysql 5.7安装方法
    mysql5.7.25搭建mysql-5.7.25.tar.gz包(亲验)
    mysql数据迁移
  • 原文地址:https://www.cnblogs.com/xiaojianwei/p/10132426.html
Copyright © 2011-2022 走看看