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 相关文章推荐
2.PHP入门
Oct 09 PHP
PHP经典的给图片加水印程序
Dec 06 PHP
编写php应用程序实现摘要式身份验证的方法详解
Jun 08 PHP
php利用curl抓取新浪微博内容示例
Apr 27 PHP
分享一则PHP定义函数代码
Feb 26 PHP
PHP编写RESTful接口
Feb 23 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
php metaphone()函数的定义和用法
May 15 PHP
thinkPHP分页功能实例详解
May 05 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
php 中phar包的使用教程详解
Oct 26 PHP
Swoole实现异步投递task任务案例详解
Apr 02 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
一个比较简单的PHP 分页分组类
2009/12/10 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
jQuery知识点整理
2015/01/30 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
python实现自动网页截图并裁剪图片
2018/07/30 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
深入了解NumPy 高级索引
2020/07/24 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
一套英文Java笔试题面试题
2016/04/21 面试题
写自荐信要注意什么
2013/12/26 职场文书
中国央视网签名寄语
2014/01/18 职场文书
工程专业应届生求职信
2014/02/19 职场文书
美容院经理岗位职责
2014/04/03 职场文书
倡议书的写法
2014/08/30 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android
一文搞懂Redis中String数据类型
2022/04/03 Redis
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫