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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
Mar 16 PHP
关于Intype一些小问题的解决办法
Mar 28 PHP
20个PHP常用类库小结
Sep 11 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
php cc攻击代码与防范方法
Oct 18 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
PHP的curl函数的用法总结
Feb 14 PHP
phpinfo的知识点总结
Oct 10 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
Apr 13 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
如何使用Strace调试工具
2013/06/03 PHP
简单实用的.net DataTable导出Execl
2013/10/28 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
javascript 函数调用规则
2009/08/26 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
node使用request请求的方法
2019/12/20 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
python单例模式实例分析
2015/04/08 Python
Python抽象类的新写法
2015/06/18 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Python解析多帧dicom数据详解
2020/01/13 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
综合素质的自我鉴定
2013/10/07 职场文书
股票投资建议书
2014/05/19 职场文书
驻村工作先进事迹
2014/08/14 职场文书