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 Memcache 中实现消息队列
Nov 24 PHP
PHP中的string类型使用说明
Jul 27 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
PHP中的类型约束介绍
May 11 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
php投票系统之增加与删除投票(管理员篇)
Jul 01 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 PHP
PHP之十六个魔术方法详细介绍
Nov 01 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 PHP
Laravel框架控制器的request与response用法示例
Sep 30 PHP
如何重写Laravel异常处理类详解
Dec 20 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
Session保存到数据库的php类分享
2011/10/24 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
python 读取、写入txt文件的示例
2020/09/27 Python
2014全国两会学习心得体会2000字
2014/03/10 职场文书
员工保密承诺书
2014/05/28 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
安全生产培训心得体会
2016/01/18 职场文书
Django实现翻页的示例代码
2021/05/24 Python
php将xml转化对象的实例详解
2021/11/17 PHP