PHP生成指定范围内的N个不重复的随机数


Posted in PHP onMarch 18, 2019

思路:将生成的随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数。

在PHP网站开发中,有时候我们需要生成指定范围内一定数量的不重复随机数,具体怎么设计这个生产随机数的函数呢?我们可以将随机产生的数存入数组,但在存入的同时去除重复的值,即可生成一定数量的不重复随机数。当然也可以把指定范围内的数值存进数组,再使用shuffle($array)打乱这个数组,然后再截取其中一定数量的值。但后面的一种做法在指定的随机数范围太大的时候会产生一个较大的数组。

下面给出第一种做法的代码,第二种做法更简单,大家可以尝试下,其实也差不多

<?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;
}

//生成10个1到100范围内的不重复随机数
$arr = unique_rand(1, 100, 10);
echo implode($arr, ",");
?>

程序运行如下:

48,5,19,36,63,72,82,77,46,16

补充几点说明:

1、生成随机数时我们用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快几倍。

2、去除数组中的重复值时用了“翻转法”,就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法在去除数组重复值的同时效率也比用 array_unique() 快得多。

3、返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,如果用for遍历的时候会有问题,但如果用foreach或不需要遍历的时候可以不需要shuffle。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
PHP安全配置
Oct 09 PHP
PHP生成Flash动画的实现代码
Mar 12 PHP
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
php自定义函数截取汉字长度
May 15 PHP
php多个文件及图片上传实例详解
Nov 10 PHP
PHP的PDO操作简单示例
Mar 30 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
PHP基于自增数据如何生成不重复的随机数示例
May 19 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 #PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 #PHP
PHP标准库(PHP SPL)详解
Mar 16 #PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 #PHP
php生成word并下载代码实例
Mar 15 #PHP
PHP-FPM的配置与优化讲解
Mar 15 #PHP
php-fpm中max_children的配置
Mar 15 #PHP
You might like
深入PHP运行环境配置的详解
2013/06/04 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php简单实现MVC
2015/02/05 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
js 编写规范
2010/03/03 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
python gdal安装与简单使用
2019/08/01 Python
PHP面试题及答案一
2012/06/18 面试题
.NET是怎么支持多种语言的
2015/02/24 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
毕业生求职简历中的自我评价
2013/10/18 职场文书
前台文员岗位职责
2013/12/28 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
科学发展观标语
2014/10/08 职场文书
学习保证书怎么写
2015/02/26 职场文书
新学期开学标语2015
2015/07/16 职场文书
常用的Python代码调试工具总结
2021/06/23 Python
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技