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 相关文章推荐
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
May 07 PHP
PHP防CC攻击实现代码
Dec 29 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
PHP实现过滤各种HTML标签
May 17 PHP
ThinkPHP中order()使用方法详解
Apr 19 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
利用PHP判断文件是否为图片的方法总结
Jan 06 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP类的自动加载机制实现方法分析
Jan 10 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实现博客,论坛图片防盗链的方法
2016/10/15 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
jquery 多个radio的click事件实例
2016/12/03 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
对Python中内置异常层次结构详解
2018/10/18 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
python wsgiref源码解析
2021/02/06 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
super关键字的用法
2012/04/10 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
英文简历中的自我评价
2013/10/06 职场文书
大学毕业生通用自荐信范文
2013/10/31 职场文书
《中华少年》教学反思
2014/02/15 职场文书
师范生小学见习总结
2015/06/23 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
浅谈Python中对象是如何被调用的
2022/04/06 Python