正態分佈隨機數C++程序

  使用Box–Muller算法生成符合正態分佈(高斯分佈)的隨機數,C++代碼如下:

#include <cstdlib>
#include <cmath>
#include <limits>
#include <stdio.h>
#include <time.h> 
using namespace std;
double generateGaussianNoise(double mu, double sigma)
{
	static const double epsilon = std::numeric_limits<double>::min();
	static const double two_pi = 2.0*3.14159265358979323846;
	double u1, u2;
	do
	{
		u1 = rand() * (1.0 / RAND_MAX);
		u2 = rand() * (1.0 / RAND_MAX);
	}
	while (u1 <= epsilon);

	double z0,z1;
	z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
	z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);

	return z0 * sigma + mu;
}
void main()
{
	srand((unsigned)time(NULL));
	unsigned int con=10000;
	FILE *fp;
	fp=fopen("C:\\Users\\Administrator\\Desktop\\data.txt","w");
	for(int i=0;i<con;i++)
		fprintf(fp,"%f\n",generateGaussianNoise(0,8));
	fclose(fp);
}

  驗證代碼(Mathematica)如下:

SetDirectory[NotebookDirectory[]];
data = Flatten@Import["data.txt", "Data"];
Show[Histogram[data, 50, "ProbabilityDensity"],Plot[PDF[NormalDistribution[0, 8], x], {x, -30, 30}, 
PlotStyle -> Thick, PlotRange -> All]]

  計算結果如下,黃色直方圖爲C++程序生成的數據,藍色曲線爲正態分佈曲線,二者吻合,證明C++程序正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章