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转成EXE文件
Oct 09 PHP
利用PHP和AJAX创建RSS聚合器的代码
Mar 13 PHP
PHP程序61条面向对象分析设计的经验小结
Nov 12 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
yii实现使用CUploadedFile上传文件的方法
Dec 28 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
PHP的反射机制实例详解
Mar 29 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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 获取客户端的真实ip
2009/11/30 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
网站上面有这种切换效果
2006/06/26 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
js function定义函数使用心得
2010/04/15 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
python基于win32api实现键盘输入
2020/12/09 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
css3实现超炫风车特效
2014/11/12 HTML / CSS
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
servlet面试题
2012/08/20 面试题
客户经理竞聘演讲稿
2014/05/15 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
交通安全教育心得体会
2016/01/15 职场文书