欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP 产生m个n范围内的不重复随机数

程序员文章站 2022-05-19 20:56:36
...

 

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