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&amp;mysql(六)
Oct 09 PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 PHP
IIS7.X配置PHP运行环境小结
Jun 09 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
php中spl_autoload详解
Oct 17 PHP
php判断数组中是否存在指定键(key)的方法
Mar 17 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
实例讲解php实现多线程
Jan 27 PHP
PHP变量的作用范围实例讲解
Dec 22 PHP
php访问对象中的成员的实例方法
Nov 17 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之第三天
2006/10/09 PHP
Phpbean路由转发的php代码
2008/01/10 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
ASP中Sub和Function的区别说明
2020/08/30 Javascript
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
详解在Python中处理异常的教程
2015/05/24 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
Python实现快速计算词频功能示例
2018/06/25 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python创建学生管理系统
2019/11/22 Python
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
软件测试常见笔试题
2012/02/04 面试题
日期和时间问题
2015/01/04 面试题
招聘与培训专员岗位职责
2014/01/30 职场文书
参观接待方案
2014/03/17 职场文书
质量承诺书格式
2014/05/20 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
2014年维稳工作总结
2014/11/18 职场文书
采购员岗位职责
2015/02/03 职场文书
军训决心书范文
2015/09/22 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers
mysql sock文件存储了什么信息
2022/07/15 MySQL