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


Posted in PHP onApril 05, 2017

因工作需要使用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);
?>

随机效果图:

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

lcg_value()的随机效果

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

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

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

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

PHP 相关文章推荐
php防注
Jan 15 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
php检测useragent版本示例
Mar 24 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
php自定义urlencode,urldecode函数实例
Mar 24 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
laravel异步监控定时调度器实例详解
Jun 21 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 #PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 #PHP
php 判断页面或图片是否经过gzip压缩的方法
Apr 05 #PHP
通过php动态传数据到highcharts
Apr 05 #PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 #PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
Apr 04 #PHP
php实现用户登陆简单实例
Apr 04 #PHP
You might like
论建造顺序的重要性
2020/03/04 星际争霸
记录mysql性能查询过程的使用方法
2013/05/02 PHP
PHP加密解密类实例分析
2015/04/20 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
vue实现搜索过滤效果
2019/05/28 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
几道PHP的面试题
2012/05/19 面试题
介绍一下MD5加密算法
2016/11/12 面试题
销售总监岗位职责
2014/01/04 职场文书
文科生自我鉴定
2014/02/15 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
贷款担保书范文
2014/05/13 职场文书
倡导文明标语
2014/06/16 职场文书
销售人员求职信
2014/07/22 职场文书
年终晚会活动方案
2014/08/21 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL