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面向对象编程快速入门
Dec 14 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
php FLEA中二叉树数组的遍历输出
Sep 26 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
php自动给网址加上链接的方法
Jun 02 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 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
header跳转和include包含问题详解
2012/09/08 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
python线程池的实现实例
2013/11/18 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
详解Python yaml模块
2020/09/23 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
教育学专业实习生的自我鉴定
2013/11/26 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
运动会报道稿300字
2014/10/02 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
工地材料员岗位职责
2015/04/11 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
学校团代会开幕词
2016/03/04 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技