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小偷相关截取函数备忘
Nov 28 PHP
8个出色的WordPress SEO插件收集
Feb 26 PHP
PHP中$this和$that指针使用实例
Jan 06 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
基于php判断客户端类型
Oct 14 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
PHP中的浅复制与深复制的实例详解
Oct 26 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
PHP7 foreach() 函数修改
Mar 09 PHP
详解php中流行的rpc框架
May 29 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
php header示例代码(推荐)
2010/09/08 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Django forms组件的使用教程
2018/10/08 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python 获取项目根路径的代码
2019/09/27 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
以太网Ethernet IEEE802.3
2013/08/05 面试题
Lucene推荐的分页方式是什么?
2015/12/07 面试题
自我推荐书
2013/12/04 职场文书
食品安全标语
2014/06/07 职场文书
六年级小学生评语
2014/12/26 职场文书
担保书格式
2015/01/20 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书