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设计模式 Composite (组合模式)
Jun 26 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
codeigniter显示所有脚本执行时间的方法
Mar 21 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
Apr 20 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
如何选购合适的收音机
2021/03/01 无线电
处理php自动反斜杠的函数代码
2010/01/05 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
php 魔术方法详解
2014/11/11 PHP
php动态函数调用方法
2015/05/21 PHP
javascript两段代码,两个小技巧
2010/02/04 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
Python fileinput模块使用实例
2015/05/28 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
优秀党支部事迹材料
2014/01/14 职场文书
董事长助理工作职责
2014/06/08 职场文书
篮球赛口号
2014/06/18 职场文书
收款委托书范本
2014/09/11 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
教导主任个人总结
2015/03/03 职场文书
竞聘书的秘诀
2019/04/02 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
mysql脏页是什么
2021/07/26 MySQL
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers