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设计聊天室步步通
Oct 09 PHP
让PHP支持页面回退的两种方法
Jan 10 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
php实现事件监听与触发的方法
Nov 21 PHP
smarty缓存用法分析
Dec 16 PHP
php实现过滤UBB代码的类
Mar 12 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
Joomla语言翻译类Jtext用法分析
May 05 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
介绍几个array库的新函数 php
2006/12/29 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
jqgrid 表格数据导出实例
2013/11/21 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
vue实现图书管理系统
2020/12/29 Vue.js
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
加强作风建设演讲稿
2014/10/24 职场文书
委托公证书样本
2015/01/23 职场文书
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL
Linux安装Docker详细教程
2022/07/07 Servers