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 08 PHP
PHP取进制余数函数代码
Jan 19 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
PHP数组实例详解
Jun 26 PHP
PHP中new static()与new self()的比较
Aug 19 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
php执行多个存储过程的方法【基于thinkPHP】
Nov 08 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
Nov 14 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 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
WINXP下apache+php4+mysql
2006/11/25 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
vue.js的安装方法
2017/05/12 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
利用python获得时间的实例说明
2013/03/25 Python
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
opencv+python实现均值滤波
2020/02/19 Python
python之语音识别speech模块
2020/09/09 Python
Django Form常用功能及代码示例
2020/10/13 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
消防安全宣传口号
2014/06/10 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
父母教会我观后感
2015/06/17 职场文书
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android