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和ACCESS写聊天室(五)
Oct 09 PHP
php Session存储到Redis的方法
Nov 04 PHP
php获取文件内容最后一行示例
Jan 09 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
Feb 07 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
php实现的PDO异常处理操作分析
Dec 27 PHP
PHP中多字节字符串操作实例详解
Aug 23 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
GD输出汉字的函数的分析
2006/10/09 PHP
一个PHP的QRcode类与大家分享
2011/11/13 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
JavaScript callback回调函数用法实例分析
2018/05/08 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
Python安装模块的常见问题及解决方法
2018/02/05 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
对python:print打印时加u的含义详解
2018/12/15 Python
python简单实现9宫格图片实例
2020/09/03 Python
python MD5加密的示例
2020/10/19 Python
Python 实现进度条的六种方式
2021/01/06 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
英文版餐饮运营管理求职信
2013/11/06 职场文书
高中生期末评语
2014/01/28 职场文书
护理学应聘自荐书范文
2014/02/05 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
商务经理岗位职责
2014/07/30 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
教师节主题班会方案
2015/08/17 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书