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去除数组中重复的元素并按键名排序函数
Aug 18 PHP
PHP 数组入门教程小结
May 20 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
PHP中把stdClass Object转array的几个方法
May 08 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
php强制用户转向www域名的方法
Jun 19 PHP
php实现的网络相册图片防盗链完美破解方法
Jul 01 PHP
php htmlentities()函数的定义和用法
May 13 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
php无限级分类实现评论及回复功能
Feb 18 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 组件化编程技巧
2009/06/06 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
PHP中数组的三种排序方法分享
2012/05/07 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
浅析get与post的一些特殊情况
2014/07/28 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
python爬取51job中hr的邮箱
2016/05/14 Python
Python随机数random模块使用指南
2016/09/09 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
大专应届生个人简历的自我评价
2013/10/15 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
人事任命书范文
2014/06/04 职场文书
文明城市创建标语
2014/06/16 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
简易离婚协议书范本
2014/10/24 职场文书
高一语文教学反思
2016/02/16 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技