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 13 PHP
解析PHP多种序列化与反序列化的方法
Jun 06 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
php合并js请求的例子
Nov 01 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
Yii CFileCache 获取不到值的原因分析
Feb 08 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 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数据类型判断函数有哪些
2013/09/23 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
node.js超时timeout详解
2014/11/26 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python生成器以及应用实例解析
2018/02/08 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
2019年Java 最常见的 面试题
2016/10/19 面试题
生产车间主管岗位职责
2013/12/28 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
《自选商场》教学反思
2014/02/14 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
创优争先心得体会
2014/09/11 职场文书
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android