使用Box-Muller变换生成具有任意sigma和mean的伪随机数

时间:2013-08-04 03:03:49

标签: algorithm random language-agnostic

我正在尝试实现Box-Muller transform来生成具有高斯分布的伪随机数。显然,这种方法只生成带有sigma 1和mean 0的数字。如何使用它生成具有任意sigma的数字并且意味着什么?

3 个答案:

答案 0 :(得分:10)

不需要单独的方法。统计数据的一个众所周知的结果是,您可以通过简单变换X = sigma*Z + mu在标准法线(高斯)值Z之间来回转换为具有平均值μ和标准偏差西格玛的一般高斯X,反之亦然, Z = (x - mu)/sigma。这就是为什么统计书只需要/提供一个高斯分布表。

答案 1 :(得分:2)

Box-Muller生成具有单位方差的分布,因此对您的问题的简短回答是:您不使用Box-Muller生成具有任意西格玛的数字。

然而,答案很长,更明亮。 Here is a paper使用修改后的Box-Muller算法,支持任意方差。这非常简单。

至于意思,那个很容易。只需在结果中添加均值即可。

归结为Lee Daniel Crocker在评论中提到的内容;乘以sigma并加上均值。

答案 2 :(得分:1)

public function genererNombreLoiNormale($mu, $sigma) {

    // On récupère deux nombres pseudo-aléatoires indépendants selon une loi uniforme sur l'intervalle [0;1]
    $randNumUni = rand(0,999) / 1000;
    $randNumBi = rand(0,999) / 1000;

    // On récupère un nombre pseudo-aléatoire selon une loi normale centrée réduite
    // (Paramètres : moyenne = 0, écart-type = 1)
    // Utilisation de l'algorithme de Box-Muller
    $randNumNorm = sqrt(-2.0*log($randNumUni))*cos(( 2.0 * 3.141592653589793238462643383279502884197169399375 )*$randNumBi);

    return ($mu + $sigma * $randNumNorm);
}

// Il suffit de centre la centre la sur une valeur $ mu et de lui donnerunécart$ sigma pour s'approcher plus ou moins du centre de lafunctionrecherché

[可能的英文翻译:将函数置于价值$ mu的中心并给它一个大小为$ sigma的间隙就足够了,这样它就会或多或少地接近所需函数的中心。