如何在PHP中生成随机数


Posted in PHP onJune 04, 2020

第一种方法用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);
?>

3.随机阅读推荐

+ php给源码加密的方法总结:https://3water.com/article/134506.html

以上就是如何在PHP中生成随机数的详细内容,更多关于PHP随机数的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
探讨PHP删除文件夹的三种方法
Jun 09 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
Sep 27 PHP
分享php分页的功能模块
Jun 16 PHP
php metaphone()函数的定义和用法
May 15 PHP
php实现文章置顶功能的方法
Oct 20 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 #PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 #PHP
PHP常用字符串函数用法实例总结
Jun 04 #PHP
TP3.2框架分页相关实现方法分析
Jun 03 #PHP
PHP Trait功能与用法实例分析
Jun 03 #PHP
PHP时间相关常用函数用法示例
Jun 03 #PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 #PHP
You might like
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
Python实现全角半角转换的方法
2014/08/18 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
Python使用python-docx读写word文档
2019/08/26 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
UNIX命令速查表
2012/03/10 面试题
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
外语专业毕业生自我评价分享
2013/10/05 职场文书
科室工作的个人自我评价
2013/10/30 职场文书
元宵节主持词
2014/03/25 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
详解Vue router路由
2021/11/20 Vue.js
Docker安装MySql8并远程访问的实现
2022/07/07 Servers