PHP生成指定范围内的N个不重复的随机数


Posted in PHP onMarch 18, 2019

思路:将生成的随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数。

在PHP网站开发中,有时候我们需要生成指定范围内一定数量的不重复随机数,具体怎么设计这个生产随机数的函数呢?我们可以将随机产生的数存入数组,但在存入的同时去除重复的值,即可生成一定数量的不重复随机数。当然也可以把指定范围内的数值存进数组,再使用shuffle($array)打乱这个数组,然后再截取其中一定数量的值。但后面的一种做法在指定的随机数范围太大的时候会产生一个较大的数组。

下面给出第一种做法的代码,第二种做法更简单,大家可以尝试下,其实也差不多

<?php
/*
* array unique_rand( int $min, int $max, int $num )
* 生成一定数量的不重复随机数,指定的范围内整数的数量必须
* 比要生成的随机数数量大
* $min 和 $max: 指定随机数的范围
* $num: 指定生成数量
*/
function unique_rand($min, $max, $num) {
  $count = 0;
  $return = array();
  while ($count < $num) {
    $return[] = mt_rand($min, $max);
    $return = array_flip(array_flip($return));
    $count = count($return);
  }
  //打乱数组,重新赋予数组新的下标
  shuffle($return);
  return $return;
}

//生成10个1到100范围内的不重复随机数
$arr = unique_rand(1, 100, 10);
echo implode($arr, ",");
?>

程序运行如下:

48,5,19,36,63,72,82,77,46,16

补充几点说明:

1、生成随机数时我们用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快几倍。

2、去除数组中的重复值时用了“翻转法”,就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法在去除数组重复值的同时效率也比用 array_unique() 快得多。

3、返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,如果用for遍历的时候会有问题,但如果用foreach或不需要遍历的时候可以不需要shuffle。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
论坛头像随机变换代码
Oct 09 PHP
PHP新手上路(六)
Oct 09 PHP
php print EOF实现方法
May 21 PHP
php 获取select下拉列表框的值
May 08 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
Dec 25 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
浅析PHP中strlen和mb_strlen的区别
Aug 31 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 #PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 #PHP
PHP标准库(PHP SPL)详解
Mar 16 #PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 #PHP
php生成word并下载代码实例
Mar 15 #PHP
PHP-FPM的配置与优化讲解
Mar 15 #PHP
php-fpm中max_children的配置
Mar 15 #PHP
You might like
用PHP生成静态HTML速度快类库
2007/03/18 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
解析isset与is_null的区别
2013/08/09 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
开放系统互连参考模型
2016/06/29 面试题
GWT的应用有哪两种部署模式
2012/12/21 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
员工工作能力评语
2014/12/31 职场文书
报案材料怎么写
2015/05/25 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书