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 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
php preg_filter执行一个正则表达式搜索和替换
Feb 27 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
PHP实现的进度条效果详解
May 03 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHP 与 UTF-8 的最佳实践详细介绍
Jan 04 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
php操作redis命令及代码实例大全
Nov 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环境――Appserv
2006/12/13 PHP
php session 预定义数组
2009/03/16 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
jquery json 实例代码
2010/12/02 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
python处理cookie详解
2014/02/07 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
Python代码实现KNN算法
2017/12/20 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
python多线程同步之文件读写控制
2021/02/25 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
遗体告别仪式答谢词
2014/01/23 职场文书
个人实习生的自我评价
2014/02/16 职场文书
写给老婆的检讨书
2014/02/21 职场文书
创先争优演讲稿
2014/09/15 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
财务人员岗位职责
2015/02/03 职场文书
吴仁宝观后感
2015/06/09 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
MySQL池化框架学习接池自定义
2022/07/23 MySQL