随机排序四种方法

随机排序四种方法

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