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蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
php中spl_autoload详解
Oct 17 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
Aug 01 PHP
基于JQuery+PHP编写砸金蛋中奖程序
Sep 08 PHP
php有效防止同一用户多次登录
Nov 19 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
Aug 17 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
php pdo连接数据库操作示例
Nov 18 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
simplehtmldom Doc api帮助文档
2012/03/26 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
Python中针对函数处理的特殊方法
2014/03/06 Python
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
python语言使用技巧分享
2016/05/31 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
python找出因数与质因数的方法
2019/07/25 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
EJB3推出JPA的原因
2013/10/16 面试题
2014小学教师个人工作总结
2014/11/10 职场文书
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫