正态分布随机数算法 @ 4/6/2009

技术类
正态分布,即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/>";
}
?>
发布于 4/6/2009 9:57:13 | 评论:4
为什么 @ 3/3/2010 10:16:20
为什么我贴出去测试报错呢
<匿名人士> @ 3/16/2011 17:37:27
$r1 是哪儿来的???
吴雨 @ 3/16/2011 18:33:14
改了,应该是贴过来时重命名了一下变量,所以弄错了。
<匿名人士> @ 3/16/2011 19:06:45
嗯,多谢。
有了IM通知果然快啊,哈哈。

看帖要回帖...

categories
archives
links
statistics
  • 网志数:1164
  • 评论数:2011