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程序占用多少内存(memory_get_usage)
Sep 23 PHP
php中session退出登陆问题
Feb 27 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
php创建session的方法实例详解
Jan 27 PHP
PHP借助phpmailer发送邮件
May 11 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
Symfony查询方法实例小结
Jun 28 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 PHP
PHP基本语法
Mar 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
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
理解JS绑定事件
2016/01/19 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现购物程序思路及代码
2017/07/24 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
python opencv实现运动检测
2018/07/10 Python
python 列表推导式使用详解
2019/08/29 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
如何整合JQuery和Prototype
2014/01/31 面试题
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
Python实现双向链表基本操作
2022/05/25 Python