php生成N个不重复的随机数实例


Posted in PHP onNovember 12, 2013

有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 strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
php将mysql数据库整库导出生成sql文件的具体实现
Jan 08 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
php使用parse_url和parse_str解析URL
Feb 22 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
PHP自定义错误处理的方法分析
Dec 19 PHP
PHP常量define和const的区别详解
May 18 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
三种php连接access数据库方法
Nov 11 #PHP
PHP中ob_start函数的使用说明
Nov 11 #PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 #PHP
PHP利用str_replace防注入的方法
Nov 10 #PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 #PHP
php中autoload的用法总结
Nov 08 #PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 #PHP
You might like
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
express express-session的使用小结
2018/12/12 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
Python中字典和集合学习小结
2017/07/07 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
python创建n行m列数组示例
2019/12/02 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
2014年计生标语
2014/06/23 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript