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在线打包程序源码
Jul 27 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
Aug 01 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
Aug 07 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
php防止表单重复提交实例讲解
Feb 11 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
几个学习PHP的网址
2006/11/25 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
Node.js文件操作详解
2014/08/16 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
简单的分页代码js实现
2016/05/17 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python解析、提取url关键字的实例详解
2018/12/17 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
什么时候需要进行强制类型转换
2016/09/03 面试题
我的动漫时代的创业计划书范文
2014/01/27 职场文书
水电站项目建议书
2014/05/12 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
端午节活动总结报告
2015/02/11 职场文书
复试通知单模板
2015/04/24 职场文书
活动总结书怎么写
2015/05/11 职场文书
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle