php高效产生m个n范围内的不重复随机数(m<=n)

注:在《 Programming Pearls 》一书中也有提到,题目为“如何高效产生m个n范围内的不重复随机数(m<=n)”(推荐学习:PHP编程从入门到精通)
该算法非常巧妙的取随机数的位置(数组的下标),替代取随机数本身,每次取到一个随机数之后,就将其在取值范围中排除,下一次仅会在剩下的数字中取,一次遍历就可以完成随机数的选取,效率相当高。
function rand_num($num='200'){
for($i=0;$i<$num;$i++){
$n[$i] = $i;
}
for($i=0;$i<$num;$i++){
$rand = mt_rand($i,$num-1);
//数组 随机数交换下标
if($n[$i] == $i){
$n[$i] = $n[$rand];
$n[$rand] = $i;
}
}
}1.第一步,为数组的每个数字按其下标顺序赋值,获得一个 $num 个数字键值对应顺序排列的数组。
立即学习“PHP免费学习笔记(深入)”;
AS系统本次的主要更新和新开发的功能如下(暂不详述): 1、修复了普及版的一些大大小小的BUG 2、重新规划整个后台,使后台更加个性化、智能化、更加易用 3、重写了广告部分模块,使其更加专业化 4、重写了文章采集模块,添加了定时自动采集功能 5、添加了供求信息采集功能 6、重写了友情连接功能(原来的太简单了) 8、重写了生成HTML模块。(几个主要模块首页不用原来的生成方式,不再会被卡巴斯机杀毒软
0
2.第二步,开始取范围[ i,$num-1 ]范围内的随机数$rand,并将获取到的随机数$rand作为数组中当前位置 键i对应下标的值$rand,将数组中 键$rand对应下标的值替换为 i,这其实就是数组键值交叉互换。意义是,将已经生成的随机数在取值范围[ i,$num-1 ]中排除,下次会在剩下的数字中[ i+1,num-1 ]取值。
3.第三步,为避免重复取值,只在未改变的键值对中进行交替运算,即在原数组顺序排列 (键==值) 的位置进行交替运算。
4.结束。

以上就是php随机数不重复的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号