全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php lcg_value与mt_rand生成0~1随机小数的效果对比分析

因工作需要使用php生成0~1随机小数,之前写过一篇《php生成0~1随机小数方法》,基于mt_rand()及mt_getrandmax()实现。

后来有网友评论,php原生方法lcg_value()可实现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()的随机效果

随机效果上比较,可以看出使用mt_rand()与mt_getrandmax()算法生成的随机效果较乱序,随机效果比lcg_value()较好。

总结:lcg_value()执行速度快,但随机效果不及基于mt_rand()mt_getrandmax()算法实现。

以上这篇php lcg_value与mt_rand生成0~1随机小数的效果对比分析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# php  # lcg  # value  # PHP中函数rand和mt_rand的区别比较  # php中随机函数mt_rand()与rand()性能对比分析  # php中mt_rand()随机数函数用法  # 深入理解PHP中mt_rand()随机数的安全  # 执行时间  # 随机数  # 给大家  # 结束时间  # 两种  # 这两个  # 希望能  # 较好  # 可以看出  # 这篇  # 速度快  # 小编  # 写过  # 大家多多  # return  # gt  # PHP_EOL  # br  # Int  # param 


相关文章: 如何解决VPS建站LNMP环境配置常见问题?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何在服务器上配置二级域名建站?  如何打造高效商业网站?建站目的决定转化率  如何通过WDCP绑定主域名及创建子域名站点?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  模具网站制作流程,如何找模具客户?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何通过宝塔面板实现本地网站访问?  如何快速启动建站代理加盟业务?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何高效利用200m空间完成建站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  黑客如何通过漏洞一步步攻陷网站服务器?  开封网站制作公司,网络用语开封是什么意思?  兔展官网 在线制作,怎样制作微信请帖?  如何在IIS中新建站点并解决端口绑定冲突?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  如何续费美橙建站之星域名及服务?  建站之星后台密码遗忘?如何快速找回?  北京网站制作的公司有哪些,北京白云观官方网站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作企业网站建设方案,怎样建设一个公司网站?  如何通过西部建站助手安装IIS服务器?  寿县云建站:智能SEO优化与多行业模板快速上线指南  香港服务器如何优化才能显著提升网站加载速度?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  宿州网站制作公司兴策,安徽省低保查询网站?  如何构建满足综合性能需求的优质建站方案?  简历在线制作网站免费版,如何创建个人简历?  如何挑选高效建站主机与优质域名?  定制建站流程步骤详解:一站式方案设计与开发指南  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  Android滚轮选择时间控件使用详解  淘宝制作网站有哪些,淘宝网官网主页?  建站主机类型有哪些?如何正确选型  如何在IIS中配置站点IP、端口及主机头?  ,购物网站怎么盈利呢?  大连 网站制作,大连天途有线官网?  如何通过建站之星自助学习解决操作问题?  如何快速搭建高效香港服务器网站?  建站之星代理如何获取技术支持?  宝塔建站后网页无法访问如何解决? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。