PHP生成随机数的方法总结


Posted in PHP onMarch 01, 2018

第一种方法用mt_rand()

function GetRandStr($length){ 
$str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
$len=strlen($str)-1; 
$randstr=''; 
for($i=0;$i<$length;$i++){ 
$num=mt_rand(0,$len); 
$randstr .= $str[$num]; 
} 
return $randstr; 
} 
$number=GetRandStr(6); 
echo $number;

第二种方法(最快的)

function make_password( $length = 8 ) 
{ 
 // 密码字符集,可任意添加你需要的字符 
 $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 
 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', 
 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 
 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 
 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', 
 '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', 
 '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', 
 '.', ';', ':', '/', '?', '|'); 
 // 在 $chars 中随机取 $length 个数组元素键名 
 $keys = array_rand($chars, $length); 
 $password = ''; 
 for($i = 0; $i < $length; $i++) 
 { 
  // 将 $length 个数组元素连接成字符串 
  $password .= $chars[$keys[$i]]; 
 } 
 return $password; 
}

第三种取当时时间戳

function get_password( $length = 8 ) 
{ 
 $str = substr(md5(time()), 0, $length);//md5加密,time()当前时间戳 
 return $str; 
}

第四种打乱字符串

function getrandstr(){ 
$str='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; 
$randStr = str_shuffle($str);//打乱字符串 
$rands= substr($randStr,0,6);//substr(string,start,length);返回字符串的一部分 
return $rands; 
}

 //开始创建验证码(直接用函数生成,比较方便快捷)

$code = rand(10000, 99999);

php mt_rand生成0~1随机小数的效果比较

lcg_value说明

float lcg_value ( void )

lcg_value() 返回范围为 (0, 1) 的一个伪随机数。本函数组合了周期为 2^31 - 85 和 2^31 - 249 的两个同余发生器。本函数的周期等于这两个素数的乘积。

返回:范围为 (0, 1) 的伪随机数。

<?php 
for($i=0; $i<5; $i++){ 
 echo lcg_value().PHP_EOL; 
} 
?>

输出:

0.11516515851995
0.064684551575297
0.68275174031189
0.55730746529099
0.70215008878091

两种生成0~1随机小数方法进行比较

1.执行时间比较

执行10万次基于mt_rand()与mt_getrandmax()算法的运行时间

<?php
/**
 * 生成0~1随机小数
 * @param Int $min
 * @param Int $max
 * @return Float
 */
function randFloat($min=0, $max=1){
 return $min + mt_rand()/mt_getrandmax() * ($max-$min);
}

// 获取microtime
function get_microtime(){
 list($usec, $sec) = explode(' ', microtime());
 return (float)$usec + (float)$sec;
}

// 记录开始时间
$starttime = get_microtime();

// 执行10万次获取随机小数
for($i=0; $i<100000; $i++){
 randFloat();
}

// 记录结束时间
$endtime = get_microtime();

// 输出运行时间
printf("run time %f ms\r\n", ($endtime-$starttime)*1000);
?>

输出:run time 266.893148 ms

执行10万次lcg_value()的运行时间

<?php
// 获取microtime
function get_microtime(){
 list($usec, $sec) = explode(' ', microtime());
 return (float)$usec + (float)$sec;
}


// 记录开始时间
$starttime = get_microtime();


// 执行10万次获取随机小数
for($i=0; $i<100000; $i++){
 lcg_value();
}


// 记录结束时间
$endtime = get_microtime();


// 输出运行时间
printf("run time %f ms\r\n", ($endtime-$starttime)*1000);
?>

输出:run time 86.178064 ms

执行时间上比较,因为lcg_value()直接是php原生方法,而mt_rand()与mt_getrandmax()需要调用两个方法,并需要进行计算,因此lcg_value()的执行时间大约快3倍。

2.随机效果比较

基于mt_rand()与mt_getrandmax()算法的随机效果

<?php
/**
 * 生成0~1随机小数
 * @param Int $min
 * @param Int $max
 * @return Float
 */
function randFloat($min=0, $max=1){
 return $min + mt_rand()/mt_getrandmax() * ($max-$min);
}


header('content-type: image/png');
$im = imagecreatetruecolor(512, 512);
$color1 = imagecolorallocate($im, 255, 255, 255);
$color2 = imagecolorallocate($im, 0, 0, 0);
for($y=0; $y<512; $y++){
 for($x=0; $x<512; $x++){
  $rand = randFloat();
  if(round($rand,2)>=0.5){
   imagesetpixel($im, $x, $y, $color1);
  }else{
   imagesetpixel($im, $x, $y, $color2);
  }
 }
}
imagepng($im);
imagedestroy($im);
?>

lcg_value()的随机效果

<?php
header('content-type: image/png');
$im = imagecreatetruecolor(512, 512);
$color1 = imagecolorallocate($im, 255, 255, 255);
$color2 = imagecolorallocate($im, 0, 0, 0);
for($y=0; $y<512; $y++){
 for($x=0; $x<512; $x++){
  $rand = lcg_value();
  if(round($rand,2)>=0.5){
   imagesetpixel($im, $x, $y, $color1);
  }else{
   imagesetpixel($im, $x, $y, $color2);
  }
 }
}
imagepng($im);
imagedestroy($im);
?>
PHP 相关文章推荐
PHP 中dirname(_file_)讲解
Mar 18 PHP
php下几个常用的去空、分组、调试数组函数
Feb 22 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
Sep 06 PHP
浅谈PHP接收POST数据方式
Jun 05 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
谈谈 PHP7新增功能
Dec 16 PHP
PHP5.6读写excel表格文件操作示例
Feb 26 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 #PHP
php实现生成带二维码图片并强制下载功能
Feb 24 #PHP
php递归函数怎么用才有效
Feb 24 #PHP
php格式文件打开的四种方法
Feb 24 #PHP
Docker搭建自己的PHP开发环境
Feb 24 #PHP
php爬取天猫和淘宝商品数据
Feb 23 #PHP
Laravel如何使用Redis共享Session
Feb 23 #PHP
You might like
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
js单例模式的两种方案
2013/10/22 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
python实现员工管理系统
2018/01/11 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
python 实现矩阵填充0的例子
2019/11/29 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
建筑工程自我鉴定
2013/10/18 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
大学生英语演讲稿
2014/04/24 职场文书
施工质量承诺书范文
2014/05/30 职场文书
优秀大学生自荐信
2015/03/26 职场文书
亮剑观后感600字
2015/06/05 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript