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 相关文章推荐
一个用php3编写的简单计数器
Oct 09 PHP
php header()函数使用说明
Jul 10 PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
使用PHP编写的SVN类
Jul 18 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
php防止伪造的数据从URL提交方法
Jun 27 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
PHP - Html Transfer Code
2006/10/09 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
根据json字符串生成Html的一种方式
2013/01/09 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
纯JS实现轮播图
2017/02/22 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
详解django.contirb.auth-认证
2018/07/16 Python
Python Collatz序列实现过程解析
2019/10/12 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
请介绍一下Ant
2016/07/22 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
致铅球运动员广播稿精选
2014/01/12 职场文书
高一新生军训感言
2014/03/02 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫