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中常用字符串处理代码片段整理
Nov 07 PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
PHP中的output_buffering详细介绍
Sep 27 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
PHP Cookie学习笔记
Aug 23 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 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中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
PHP7变量处理机制修改
2021/03/09 PHP
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
jquery实现吸顶导航效果
2020/01/08 jQuery
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
python实现简单学生信息管理系统
2020/04/09 Python
python raise的基本使用
2020/09/10 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
聚美优品的广告词
2014/03/14 职场文书
大学毕业生推荐信
2014/07/09 职场文书
网聊搭讪开场白
2015/05/28 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
Python如何用re模块实现简易tokenizer
2022/05/02 Python
python开发制作好看的时钟效果
2022/05/02 Python