PHP 生成N个不重复的随机数


Posted in PHP onJanuary 21, 2015

起因:

有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开发GUI
Oct 09 PHP
php 文本文件的读取效率
Feb 10 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
php中JSON的使用方法
Apr 30 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
php防止用户重复提交表单
Nov 02 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
php排序算法实例分析
Oct 17 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
PHP7 windows支持
Mar 09 PHP
PHP 实现判断用户是否手机访问
Jan 21 #PHP
PHP中imagick函数的中文解释
Jan 21 #PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 #PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 #PHP
PHP中让curl支持sock5的代码实例
Jan 21 #PHP
PHP中使用break跳出多重循环代码实例
Jan 21 #PHP
PHP获取数组最后一个值的2种方法
Jan 21 #PHP
You might like
用PHP实现图象锐化代码
2007/06/14 PHP
php Session存储到Redis的方法
2013/11/04 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
深入理解PHP内核(一)
2015/11/10 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
自动更新作用
2006/10/08 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
Python模块文件结构代码详解
2018/02/03 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
2014年社区重阳节活动策划方案
2014/09/16 职场文书
工作证明英文模板
2014/10/21 职场文书
开除员工通知
2015/04/22 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript