随机生成服从Gaussian分布点的方法有很多种,具体可以参考链接;本文采用的是Box-Muller transform方法。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define M_PI 3.14159265358979323846
double generateGaussianNoise(double mu, double sigma){
double twopi = 2.0 * M_PI;
double r_a = rand()/(RAND_MAX + 1.0);
double r_b = rand()/(RAND_MAX + 1.0);
double u1 = 1.0f - r_a;// [0, 1) -> (0, 1]
double u2 = r_b;
double radius = sqrt(-2.0 * log(u1));
double theta = twopi * u2;
double data = radius * cos(theta);
return data * sigma + mu;
}
double generateLogNormalNoise(double mu, double sigma){
double twopi = 2.0 * M_PI;
double r_a = rand()/(RAND_MAX + 1.0);
double r_b = rand()/(RAND_MAX + 1.0);
double u1 = 1.0f - r_a;// [0, 1) -> (0, 1]
double u2 = r_b;
double radius = sqrt(-2.0 * log(u1));
double theta = twopi * u2;
double data = radius * cos(theta);
return exp(data * sigma + mu);
}
int main(){
int count = 200000;
double mu = 0.0;
double sigma = 0.5;
for (int i = 0; i<count; i++){
//double ret = generateGaussianNoise(mu, sigma);
double ret = generateLogNormalNoise(mu, sigma);
printf("%lf\n", ret);
}
return 0;
}
generateGaussianNoise
函数随机生成符合Gaussian
分布的点,调用generateLogNormalNoise
随机生成符合log-normal分布的点;维基中给出的Gaussian
分布以及main
函数中随机生成20万个点生成的概率密度分布(PDF)分别为为:
维基中给出的log-normal
分布以及main
函数中随机生成20万个点生成的概率密度分布(PDF)分别为为:
完整的文件可参考链接。