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 相关文章推荐
动态新闻发布的实现及其技巧
Oct 09 PHP
第三节--定义一个类
Nov 16 PHP
推荐个功能齐全的发送PHP邮件类
Jan 03 PHP
php Mysql日期和时间函数集合
Nov 16 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
深入理解PHP中的count函数
May 31 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
ThinkPHP实现登录退出功能
Jun 29 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
Yii2使用表单上传文件的实例代码
Aug 03 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运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
Python自动登录126邮箱的方法
2015/07/10 Python
Python实现的矩阵类实例
2017/08/22 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
python pip如何手动安装二进制包
2020/09/30 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
STP的判定过程
2012/10/01 面试题
银行实习生的自我评价
2014/01/13 职场文书
目标责任书范本
2014/04/16 职场文书
养牛场项目建议书
2014/05/13 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
学习十八大的感悟
2015/08/11 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
openstack中的rpc远程调用的方法
2021/07/09 Python
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS