PHP 生成N个不重复的随机数


Posted in PHP onJanuary 21, 2015

起因:

有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次。前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空。那么你会如何填补这个漏子?

当然向上级反映情况。但是我们这里讨论的是技术,就是需要生成1-25之间的16个不重复的随机数,去填补。具体怎么设计函数呢?将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数。

程序如下:

<?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;

}

$arr = unique_rand(1, 25, 16);

sort($arr);

$result = '';

for($i=0; $i < count($arr);$i++)

{

  $result .= $arr[$i].',';

}

$result = substr($result, 0, -1);

echo $result;

?>

程序运行如下:

2,3,4,6,7,8,9,10,11,12,13,16,20,21,22,24

补充几点说明:

生成随机数时用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快四倍。
去除数组中的重复值时用了“翻翻法”,就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法比用 array_unique() 快得多。
返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,给遍历带来麻烦。

PHP 相关文章推荐
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
PHP随机数生成代码与使用实例分析
Apr 08 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 PHP
PHP 实现判断用户是否手机访问
Jan 21 #PHP
PHP中imagick函数的中文解释
Jan 21 #PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 #PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 #PHP
PHP中让curl支持sock5的代码实例
Jan 21 #PHP
PHP中使用break跳出多重循环代码实例
Jan 21 #PHP
PHP获取数组最后一个值的2种方法
Jan 21 #PHP
You might like
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
YII中assets的使用示例
2014/07/31 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
javascript replace()正则替换实现代码
2010/02/26 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
使用nodejs中httpProxy代理时候出现404异常的解决方法
2016/08/15 NodeJs
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
python中列表元素连接方法join用法实例
2015/04/07 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
会计专业推荐信
2013/10/29 职场文书