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 相关文章推荐
PHP5中的this,self和parent关键字详解教程
Mar 19 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
浅析Yii2中GridView常见操作
Apr 22 PHP
PHP实现路由映射到指定控制器
Aug 13 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
stripos函数知识点实例分享
Feb 11 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
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
Angular排序实例详解
2017/06/28 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
vue数组对象排序的实现代码
2018/06/20 Javascript
koa源码中promise的解读
2018/11/13 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
django 外键model的互相读取方法
2018/12/15 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
python实现坦克大战
2020/04/24 Python
为什么相对PHP黑python的更少
2020/06/21 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
Python实现疫情地图可视化
2021/02/05 Python
意向协议书范本
2014/04/23 职场文书
小学教师培训方案
2014/06/09 职场文书
班级体育活动总结
2014/07/05 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
初中成绩单评语
2014/12/29 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
linux目录管理方法介绍
2022/06/01 Servers
HttpClient实现文件上传功能
2022/08/14 Java/Android