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带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
解析php中的fopen()函数用打开文件模式说明
Jun 20 PHP
php版淘宝网查询商品接口代码示例
Jun 17 PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
php简单检测404页面的方法示例
Aug 23 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 PHP
简单的php购物车代码
Jun 05 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
Zend Guard一些常见问题解答
2008/09/11 PHP
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
JS高级笔记
2011/07/13 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
Python每天必学之bytes字节
2016/01/28 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
基于python使用tibco ems代码实例
2019/12/20 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
幼师自我鉴定范文
2013/10/01 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
小区推广策划方案
2014/06/06 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
分居协议书范本
2014/11/03 职场文书
安全承诺书
2015/01/19 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL
Mysql数据库命令大全
2021/05/26 MySQL
Python中第三方库Faker的使用详解
2022/04/02 Python