1. 程式人生 > >PHP 產生m個n範圍內的不重複隨機數

PHP 產生m個n範圍內的不重複隨機數

PHP高效產生m個n範圍內的不重複隨機數(m<=n)

方法一:

<?php

for ($i=1;$i<=52;$i++) {
	$arr[]= $i;
}

shuffle($arr);
print_r($arr);

方法二:

注:在《 Programming Pearls 》一書中也有提到,題目為“如何高效產生m個n範圍內的不重複隨機數(m<=n)”該演算法非常巧妙的取隨機數的位置(陣列的下標),替代取隨機數本身,每次取到一個隨機數之後,就將其在取值範圍中排除,下一次僅會在剩下的數字中取,一次遍歷就可以完成隨機數的選取,效率相當高。

<?php

/* 生成52張牌 1,2,3,4,5..52 */
for ($i=1;$i<=52;$i++) {
	$arr[]= $i;
}

function rand_num($num='20'){
	
	for($i=1;$i<=$num;$i++){
		$n[$i] = $i;
	}
	
	for ($i=1;$i<=$num;$i++) {
		
		$rand = mt_rand($i,$num);
		
		if ($n[$i] == $i) {
			$n[$i] = $rand;
			$n[$rand] = $i;
		}
		
	}
	
	return $n;
	
}

echo "<pre>";
print_r(rand_num(count($arr)));

1.第一步,為陣列的每個數字按其下標順序賦值,獲得一個 $num 個數字鍵值對應順序排列的陣列。

2.第二步,開始取範圍[ i,$num ]範圍內的隨機數$rand,並將獲取到的隨機數$rand作為陣列中當前位置 鍵i對應下標的值$rand,將陣列中 鍵$rand對應下標的值替換為 i,這其實就是陣列鍵值交叉互換。意義是,將已經生成的隨機數在取值範圍[ i,$num ]中排除,下次會在剩下的數字中[ i+1,num ]取值。

3.第三步,為避免重複取值,只在未改變的鍵值對中進行交替運算,即在原陣列順序排列 (鍵==值) 的位置進行交替運算。

4.結束。

--------------------- 原作者:KShame 來源:CSDN 原文:https://blog.csdn.net/llfdhr/article/details/53330841?utm_source=copy