使用Box–Muller transform随机生成服从Gaussian以及log-normal分布的点

5 篇文章 0 订阅
5 篇文章 0 订阅

随机生成服从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)分别为为:


完整的文件可参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值