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 相关文章推荐
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
php a simple smtp class
Nov 26 PHP
PHP循环获取GET和POST值的代码
Apr 09 PHP
PHP中Date获取时间不正确怎么办
Jun 05 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
PHP常用正则表达式集锦
Aug 17 PHP
PHP函数eval()介绍和使用示例
Aug 20 PHP
php 生成签名及验证签名详解
Oct 26 PHP
PHP fclose函数用法总结
Feb 15 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数组(array)输出的三种形式详解
2013/06/05 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
用js实现trim()的解决办法
2013/04/16 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
详解vue 命名视图
2019/08/14 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
selenium+python实现自动登录脚本
2018/04/22 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
python查看数据类型的方法
2019/10/12 Python
tensorboard显示空白的解决
2020/02/15 Python
如何用python处理excel表格
2020/06/09 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
法学研究生自我鉴定范文
2013/12/04 职场文书
小学毕业感言300字
2014/02/19 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
小学母亲节活动方案
2014/03/14 职场文书
个人培训自我鉴定
2014/03/28 职场文书
见习报告怎么写
2014/10/31 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
SQL SERVER中的流程控制语句
2022/05/25 SQL Server
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js