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文件读写操作之文件读取方法详解
Jan 13 PHP
解决file_get_contents无法请求https连接的方法
Dec 17 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
destoon实现首页显示供应、企业、资讯条数的方法
Jul 15 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
微信公众平台DEMO(PHP)
May 04 PHP
php简单统计在线人数的方法
May 10 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
php绘制圆形的方法
2015/01/24 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
js 操作css实现代码
2009/06/11 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
用Python制作简单的钢琴程序的教程
2015/04/01 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
Java程序员综合测试题
2014/04/25 面试题
简历自荐信
2013/12/02 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python