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中$this-&amp;gt;含义分析
Nov 29 PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 PHP
php把session写入数据库示例
Feb 26 PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
php数组分页实现方法
Apr 30 PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 PHP
PHP使用递归算法无限遍历数组示例
Jan 13 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 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
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
Python pickle模块用法实例
2015/04/14 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
战友聚会邀请函
2014/01/18 职场文书
教师考察材料范文
2014/06/03 职场文书
书法大赛策划方案
2014/06/04 职场文书
教师四风问题整改措施
2014/09/25 职场文书
顶岗实习计划书
2015/01/16 职场文书
聘任书的格式及模板
2019/10/28 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang