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 相关文章推荐
967 个函式
Oct 09 PHP
php桌面中心(二) 数据库写入
Mar 11 PHP
php 抽象类的简单应用
Sep 06 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
php中base_convert()进制数字转换函数实例
Nov 20 PHP
Cygwin中安装PHP方法步骤
Jul 04 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 PHP
php的lavarel框架中join和orWhere的用法
Dec 28 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
9个PHP开发常用功能函数小结
2011/07/15 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
javascript json 新手入门文档
2009/12/03 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
python实现多线程网页下载器
2018/04/15 Python
python线程池threadpool实现篇
2018/04/27 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
课改先进个人汇报材料
2014/01/26 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
课外活动实习计划
2015/01/19 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
学前教育见习总结
2015/06/23 职场文书
员工考勤管理制度
2015/08/06 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
Python实现拼音转换
2021/06/07 Python