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 相关文章推荐
利用discuz实现PHP大文件上传应用实例代码
Nov 14 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
Aug 21 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
php制作简单模版引擎
Apr 07 PHP
PHP安全下载文件的方法
Apr 07 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
PHP中关键字interface和implements详解
Jun 14 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 PHP
关于PHP求解三数之和问题详析
Nov 09 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
星际中的相关伤害
2020/03/04 星际争霸
javascript 小型动画组件与实现代码
2010/06/02 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
简约JS日历控件 实例代码
2013/07/12 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
原生js实现日历效果
2020/03/02 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
python中的函数用法入门教程
2014/09/02 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
python相对企业语言优势在哪
2020/06/12 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
全球立体声:World Wide Stereo
2018/09/29 全球购物
方正Java笔试题
2014/07/03 面试题
Java面试题汇总
2015/12/06 面试题
教育孩子心得体会
2014/01/01 职场文书
老师对学生的评语
2014/04/18 职场文书
申报材料格式
2014/12/30 职场文书
职称评定个人总结
2015/03/05 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
使用python创建股票的时间序列可视化分析
2022/03/03 Python
TS 类型兼容教程示例详解
2022/09/23 Javascript