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语法(1)
Oct 09 PHP
用PHP实现小型站点广告管理(修正版)
Oct 09 PHP
php实现文件下载更能介绍
Nov 23 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
php根据身份证号码计算年龄的实例代码
Jan 18 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
php实现源代码加密的方法
Jul 11 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
PHP的swoole扩展安装方法详细教程
May 18 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 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接口与接口引用的深入解析
2013/08/09 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
JavaScript事件列表解说
2006/12/22 Javascript
Firefox div高度自适应
2009/04/28 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
对Python信号处理模块signal详解
2019/01/09 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
利用python生成照片墙的示例代码
2020/04/09 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
flask开启多线程的具体方法
2020/08/02 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
公司财务工作总结的自我评价
2013/11/23 职场文书
土地转让协议书
2014/04/15 职场文书
创先争优个人承诺书
2014/08/30 职场文书
大学生见习报告总结
2014/11/04 职场文书
保研导师推荐信
2015/03/25 职场文书
生日赠语
2015/06/23 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP