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动态生成虚拟现实VRML网页
Oct 09 PHP
php smarty的预保留变量总结
Dec 04 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
PHP动态柱状图实现方法
Mar 30 PHP
PHP获取毫秒级时间戳的方法
Apr 15 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
php生成word并下载代码实例
Mar 15 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 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目录遍历函数opendir用法实例
2014/11/20 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
C# Debug和Testing相关面试题
2015/10/25 面试题
大气污染防治方案
2014/05/19 职场文书
小学主题班会教案
2015/08/17 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
Oracle用户管理及赋权
2022/04/24 Oracle