學習如何用平均分佈隨機數生成正態分佈隨機數
阿新 • • 發佈:2021-02-11
最近在研究stage原始碼的時候,發現其中ranger的正態分佈噪聲模型使用了一個演算法,很值得借鑑。
演算法名叫Box–Muller transform,發明於1934年,總結在此。
公式為:截圖來源wikihttps://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
其中U1 U2 為0到1之間的均勻分佈隨機數
Z1公式中根號下 少一個符號,注意!
下面為程式碼:來源stage,可以生成均值為0,方差為variance的正態分佈。
https://codedocs.xyz/CodeFinder2/Stage/group__model__ranger.html
// Returns gaussian noise // taken from http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform template <class Scalar_t> Scalar_t generateGaussianNoise(Scalar_t variance) { static bool haveSpare = false; static Scalar_t rand1, rand2; if (haveSpare) { haveSpare = false; return sqrt(variance * rand1) * sin(rand2); } haveSpare = true; rand1 = rand() / ((Scalar_t)RAND_MAX); if (rand1 < 1e-100) rand1 = 1e-100; rand1 = -2 * log(rand1); rand2 = (rand() / ((Scalar_t)RAND_MAX)) * TWO_PI; return sqrt(variance * rand1) * cos(rand2); }