深海中的STL,1随机小数的效果对比分析

时间:2019-09-25 21:15来源: 操作系统
mt19937 当你首先眼观看这玩意儿的时候 自然受不了吐槽:纳尼?这是什么样鬼? 实在,那么些东西不敢问津,不过它却有着杰出的品质 因职业亟待运用php生成0~1随机小数,以前写过一

mt19937

当你首先眼观看这玩意儿的时候

自然受不了吐槽:纳尼?这是什么样鬼?

实在,那么些东西不敢问津,不过它却有着杰出的品质

因职业亟待运用php生成0~1随机小数,以前写过一篇《php生成0~1随机小数方法》,基于mt_rand()及mt_getrandmax()实现。

简介

mt19917是c++1第11中学踏向的新特性

它是一种随机数算法,用法与rand()函数类似

然而全部速度快,周期长的特色(它的名字便出自周期长度:2^一九九二7-1)

说的直接一点,大家都精通rand()在windows下转移的数码范围为0-32767

不过那些函数的私行范围大致在((-maxint,+maxint))(maxint为int类型最大值)

后来有网上朋友评价,php原生方法lcg_value()可实现0~1随机小数生成。

实例

其一东西用法特别轻便

#include<random>#include<ctime>std::mt19937 rnd;int main(){    printf("%lldn",rnd;    return 0;}

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 msrn", ($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 msrn", ($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);
?>

专擅效果图:

图片 1

lcg_value()的大肆效果

图片 2

自由效果上相比,能够看出使用mt_rand()与mt_getrandmax()算法生成的人身自由效果较乱序,随机效果比lcg_value()较好。

总结:**lcg_value()奉行进程快,但随便效果比不上基于mt_rand()mt_getrandmax()**算法实现。

如上这篇php lcg_value与mt_rand生成0~1随机小数的作用相比较分析就是小编分享给我们的全体内容了,希望能给我们八个参阅,也可望我们多多补助脚本之家。

您大概感兴趣的篇章:

  • PHP中函数rand和mt_rand的界别比较
  • php中专擅函数mt_rand()与rand()品质相比较深入分析
  • php中mt_rand()随机数函数用法
  • 深深精晓PHP中mt_rand()随机数的哈密

编辑: 操作系统 本文来源:深海中的STL,1随机小数的效果对比分析

关键词: