正态分布随机数算法 (php实现)

正态分布,即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 $useLast = 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;
}
复制代码

测试代码:

复制代码
$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 \n";
}
复制代码

 

posted on   wpjamer  阅读(1451)  评论(1编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示