如何在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 相关文章推荐
PHP 中的面向对象编程:通向大型 PHP 工程的办法
Dec 03 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
php操作xml
Oct 27 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
cakephp打印sql语句的方法
Feb 13 PHP
PHP可变变量学习小结
Nov 29 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
laravel 解决Validator使用中出现的问题
Oct 25 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php之字符串变相相减的代码
2007/03/19 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
小试SVG之新手小白入门教程
2019/01/08 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
Python验证文件是否可读写代码分享
2017/12/11 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
汉森批发:Hansen Wholesale
2018/05/24 全球购物
学校介绍信范文
2014/01/14 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
2015年电工工作总结
2015/04/10 职场文书
运动会通讯稿100字
2015/07/20 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
netty 实现tomcat的示例代码
2022/06/05 Servers