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 正则匹配函数体
Aug 25 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 PHP
PHP处理Oracle的CLOB实例
Nov 03 PHP
PHP生成压缩文件实例
Feb 07 PHP
PHP+MYSQL实现用户的增删改查
Mar 24 PHP
PHP模拟asp.net的StringBuilder类实现方法
Aug 08 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 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 zend解密软件绿色版测试可用
2008/04/14 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
jquery连缀语法如何实现
2012/11/29 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
python进阶教程之词典、字典、dict
2014/08/29 Python
Python出现segfault错误解决方法
2016/04/16 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
python微信好友数据分析详解
2018/11/19 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
档案管理员岗位职责
2013/12/01 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
说明书范文
2014/05/07 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
无线电通信名词解释
2022/02/18 无线电