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 相关文章推荐
探讨GDFONTPATH能否被winxp下的php支持
Jun 21 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
简单谈谈php延迟静态绑定
Jan 26 PHP
PHP图片添加水印功能示例小结
Oct 03 PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
Nov 29 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
php 可变函数使用小结
Jun 12 PHP
php如何把表单内容提交到数据库
Jul 08 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人民币金额转大写实例代码
2015/10/02 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
vue实现评论列表功能
2019/10/25 Javascript
js实现聊天对话框
2020/02/08 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
2019年c语言经典面试题目
2016/08/17 面试题
酒店中秋节活动方案
2014/01/31 职场文书
责任担保书范文
2014/05/21 职场文书
典型事迹材料范文
2014/12/29 职场文书
早会开场白台词大全
2015/06/01 职场文书
开学第一周值周总结
2015/07/16 职场文书
员工旷工检讨书
2015/08/15 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
MySQL 聚合函数排序
2021/07/16 MySQL
vue使用watch监听属性变化
2022/04/30 Vue.js
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS