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 相关文章推荐
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
Dec 30 PHP
PHP 类相关函数的使用详解
May 10 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
ThinkPHP文件缓存类代码分享
Apr 22 PHP
如何正确配置Nginx + PHP
Jul 15 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
form自动提交实例讲解
Jul 10 PHP
php微信公众号开发之音乐信息
Oct 20 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 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日历程序
2006/12/06 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
脚本收藏iframe
2006/07/21 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
axios的拦截请求与响应方法
2018/08/11 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
复制粘贴功能的Python程序
2008/04/04 Python
python实现黑客字幕雨效果
2018/06/21 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
天网面试题
2013/04/07 面试题
迎元旦广播稿
2014/02/22 职场文书
通用自荐信范文
2014/03/14 职场文书
工厂标语大全
2014/10/06 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
民事和解协议书格式
2014/11/29 职场文书
2019年思想汇报
2019/06/20 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS