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 相关文章推荐
也谈 PHP 和 MYSQL
Oct 09 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
Feb 18 PHP
CodeIgniter输出中文乱码的两种解决办法
Jun 12 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 PHP
PHP读取word文档的方法分析【基于COM组件】
Aug 01 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
Jun 08 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模拟js函数unescape的函数代码
2012/10/20 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
php实现小程序支付完整版
2018/10/09 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
Vue动画事件详解及过渡动画实例
2019/02/09 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
python多进程实现文件下载传输功能
2018/07/28 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
客房主管岗位职责
2013/12/09 职场文书
记者岗位职责
2014/01/06 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
python 如何获取页面所有a标签下href的值
2021/05/06 Python
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP