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实现MySQL更新记录的代码
Jun 07 PHP
PHP 文件上传全攻略
Apr 28 PHP
PHP防CC攻击实现代码
Dec 29 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
php中explode函数用法分析
Nov 15 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
stripos函数知识点实例分享
Feb 11 PHP
Yii 框架入口脚本示例分析
May 19 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
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
IE中createElement需要注意的一个问题
2010/07/13 Javascript
Jquery中getJSON在asp.net中的使用说明
2011/03/10 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
浅析Jquery操作select
2016/12/13 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
使用tensorflow实现线性svm
2018/09/07 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
编写python代码实现简单抽奖器
2020/10/20 Python
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
优秀实习自我鉴定
2013/12/04 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
企业办公室岗位职责
2014/03/12 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
企业党建工作总结2015
2015/05/26 职场文书
个人向公司借款协议书
2016/03/19 职场文书
六年级作文之自救
2019/12/19 职场文书
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js