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中使用模板的方法
May 24 PHP
PHP 采集程序中常用的函数
Dec 09 PHP
PHP测试程序运行时间的类
Feb 05 PHP
解析php中如何直接执行SHELL
Jun 28 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
php操作redis缓存方法分享
Jun 03 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
微信支付开发告警通知实例
Jul 12 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
Laravel5中Cookie的使用详解
May 03 PHP
php处理静态页面:页面设置缓存时间实例
Jun 22 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
wxPython事件驱动实例详解
2014/09/28 Python
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
python实现翻译word表格小程序
2020/02/27 Python
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
浅谈react路由传参的几种方式
2021/03/23 Javascript
上下班时间调整通知
2015/04/23 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
检讨书之工作不认真
2019/08/14 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js