我正在尝试实现Box-Muller 变换以生成具有高斯分布的伪随机数。显然,此方法仅生成具有 sigma 1 和均值 0 的数字。如何使用它生成具有任意 sigma 和均值的数字?
3 回答
不需要单独的方法。统计学的一个众所周知的结果是,您可以通过简单的转换在标准正态(高斯)值 Z 到具有平均 mu 和标准偏差 sigma 的一般高斯 X 之间来回转换X = sigma*Z + mu
,反之亦然Z = (x - mu)/sigma
。这就是为什么统计书籍只需要/提供一张高斯分布表的原因。
Box-Muller 生成具有单位方差的分布,因此对您的问题的简短回答是:您不使用 Box-Muller 生成具有任意 sigma 的数字。
然而,长答案更明确。这是一篇带有修改后的 Box-Muller 算法的论文,该算法支持任意方差。这很简单。
至于意思,那很容易。只需将平均值添加到您的结果中。
归结为李丹尼尔克罗克在评论中提到的内容;乘以 sigma 并加上平均值。
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 centrer la function sur une valeur $mu et de lui donner un écart $sigma pour s'approcher plus ou moins du center de la function recherché
[一种可能的英文翻译:将函数的中心放在一个值 $mu 上并给它一个大小为 $sigma 的间隙就足够了,这样它就会或多或少地接近所需函数的中心。]