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压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
CI框架整合smarty步骤详解
May 19 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
Symfony2创建基于域名的路由相关示例
Nov 14 PHP
thinkPHP中配置的读取与C方法详解
Dec 05 PHP
利用php生成验证码
Feb 23 PHP
php读取本地json文件的实例
Mar 07 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
PHP个人网站架设连环讲(四)
2006/10/09 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
javascript实现单击和双击并存的方法
2014/12/13 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
python抓取网页中链接的静态图片
2018/01/29 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
django model通过字典更新数据实例
2020/04/01 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
如何教少儿学习Python编程
2020/07/10 Python
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
计算机个人求职信范例
2014/01/24 职场文书
初中同学聚会感言
2014/02/11 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
利用Pycharm连接服务器的全过程记录
2021/07/01 Python