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日期时间函数的高级应用技巧
May 16 PHP
php批量缩放图片的代码[ini参数控制]
Feb 11 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
基于PHP array数组的教程详解
Jun 05 PHP
探讨PHP删除文件夹的三种方法
Jun 09 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
用PHP代码给图片加水印
Jul 01 PHP
PHP实现合并discuz用户
Aug 05 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
php提取微信账单的有效信息
Oct 01 PHP
PHP explode()函数用法讲解
Feb 15 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
mongodb和php的用法详解
2019/03/25 PHP
激活 ActiveX 控件
2006/10/09 Javascript
非常漂亮的JS代码经典广告
2007/10/21 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
layui表格实现代码
2017/05/20 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
js+css3实现简单时钟特效
2020/09/13 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python求解水仙花数的方法
2015/05/11 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
学生实习介绍信
2014/01/15 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
2014年库房工作总结
2014/11/26 职场文书
2016年校长新年寄语
2015/08/17 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
MySQL之DML语言
2021/04/05 MySQL