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 生成饼图 三维饼图
Sep 28 PHP
php 安全过滤函数代码
May 07 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
php输出金字塔的2种实现方法
Dec 16 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
php 截取utf-8格式的字符串实例代码
Oct 30 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
Lumen timezone 时区设置方法(慢了8个小时)
Jan 20 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 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
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
简单了解django索引的相关知识
2019/07/17 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
详解px单位html5响应式方案
2018/03/08 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
公司年会演讲稿范文
2014/01/11 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
2014年环保局工作总结
2014/12/11 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript