隨機排序四種方法


隨機排序四種方法

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

原理:洗牌算法就是將循環的數保存下來,保存下來后就隨機產生一個數,將隨機產生的數賦值給前面保存的數,然后再講前面保存的數給當前隨機產生的數,最后直到將數組的長度循環完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM