menu

秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

正态分布随机数算法

正态分布,即Normal Distribution,又名高斯分布,对应的高斯方程在http://en.wikipedia.org/wiki/Gaussian_function
本算法主要参考:http://en.wikipedia.org/wiki/Box-Muller_transform,使用PHP实现的。

<?php
/*
* 使用Box-Mueller方法,生成正态分布随机数。
*
* @desc 使用Box-Mueller方法,生成正态分布随机数。
* @return float 随机数
*/
function normalRand() {
static $last = FALSE;
static $n;

if ($last) {
$last = FALSE;
$m = $n;
} else {
do {
// 以下为Box-Mueller方法
$range = 10000000;
$u = mt_rand(1, $range) / $range;
$v = mt_rand(1, $range) / $range;
$s = sqrt(-2 * log($u));
$x = $s * sin(2 * M_PI * $v);
$y = $s * cos(2 * M_PI * $v);
// 以下为封装
$width = 1.0; // 分布的宽度。
$step = 3.0; // 分布的锋锐程度。数字越小,曲线越平。
$m = $x / ($step * $width * 2.0) + $width / 2.0;
$n = $y / ($step * $width * 2.0) + $width / 2.0;
if($m < $width && $m > 0 && $n < $width && $n > 0) {
$useLast = TRUE;
}
} while(!$useLast);
}
return $m;
}


代码很简单了,看看原理就知道怎么这么实现了。

测试代码:

<?php
$all = array();
foreach(range(0,10) as $key) {
$all[$key] = 0;
}

for($i = 0; $i < 10000; $i++) {
$n = round(normalRand() * 10);
$all[$n] ++;
}

foreach($all as $key=>$value) {
echo "$key, $value<br/>";
}
?>

为什么我贴出去测试报错呢

$r1 是哪儿来的???

改了,应该是贴过来时重命名了一下变量,所以弄错了。

嗯,多谢。
有了IM通知果然快啊,哈哈。

评论已关闭