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 similar_text 字符串的相似性比较函数
May 26 PHP
php foreach 参数强制类型转换的问题
Dec 10 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
详细解读PHP中接口的应用
Aug 12 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
Apr 05 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
PHP后门隐藏的一些技巧总结
Nov 04 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
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
php微信公众号开发模式详解
2016/11/28 PHP
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
js装饰设计模式学习心得
2018/02/17 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
浅谈Python __init__.py的作用
2020/10/28 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
一套软件测试笔试题
2014/07/25 面试题
网上开商店的创业计划书
2014/01/19 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
个性婚礼策划方案
2014/05/17 职场文书
情人节活动总结范文
2015/02/05 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
525心理健康活动总结
2015/05/08 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang