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 cron中的批处理
Sep 16 PHP
php面向对象全攻略 (七) 继承性
Sep 30 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
PHP bin2hex()函数基础实例讲解
Feb 11 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
PHP IE中下载附件问题解决方法
2014/01/07 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
github配置使用指南
2014/11/18 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
函授自我鉴定
2013/11/06 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
实习自我鉴定
2013/12/15 职场文书
施工单位安全责任书
2014/07/24 职场文书
2014年个人售房协议书
2014/10/30 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
军训新闻稿范文
2015/07/17 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
springboot读取nacos配置文件
2022/05/20 Java/Android