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 全文搜索和替换的实现代码
Jul 29 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
20个PHP常用类库小结
Sep 11 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
PHP分页类集锦
Nov 18 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
Dec 21 PHP
PHP截取IE浏览器并缩小原图的方法
Mar 04 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
phpinfo的知识点总结
Oct 10 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 PHP
php慢查询日志和错误日志使用详解
Feb 27 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
php 图像函数大举例(非原创)
2009/06/20 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
python创建文件备份的脚本
2018/09/11 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
会议活动邀请函
2014/01/27 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
师范生自我鉴定
2014/03/20 职场文书
债务纠纷委托书
2014/08/30 职场文书
店面出租协议书范本
2014/11/28 职场文书
小学英语教学随笔
2015/08/14 职场文书
Mysql文件存储图文详解
2021/06/01 MySQL
python自动化八大定位元素讲解
2021/07/09 Python
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis