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中的float类型使用说明
Jul 27 PHP
PHP文件注释标记及规范小结
Apr 01 PHP
PHP+MySQL投票系统的设计和实现分享
Sep 23 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
基于empty函数的判断详解
Jun 17 PHP
PHP将HTML转换成文本的实现代码
Jan 21 PHP
PHP加密解密字符串汇总
Apr 26 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
Jun 13 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
PHP封装的XML简单操作类完整实例
Nov 13 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之第一天
2006/10/09 PHP
PHP5 面向对象(学习记录)
2009/12/02 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
js切换光标示例代码
2013/10/10 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
Bootstrap每天必学之js插件
2015/11/30 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
解决python写的windows服务不能启动的问题
2014/04/15 Python
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
为什么会有内存对齐
2016/10/10 面试题
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
授权委托书
2014/09/17 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python