概述
昨天给啸啸讲题的时候说到了正态分布,今天又正巧看到了公式,那么就自己生成了一下符合正态分布的随机数。
C++程序如下:
#include <iostream> #include <list> #include <fstream> #include <iterator> #include <iomanip> #include <math.h> #include <TIME.H> #include <stdlib.h> #include <algorithm> using namespace std; class randNbs { public: void Display() { //myXs.sort(); ofstream fout; fout.open("output.txt"); fout << "***X coordinates***" << endl; for (list<double>::iterator itList = (myXs.begin()); itList != (myXs.end()); itList++) { fout << setiosflags(ios::fixed) << setprecision(2) << (*itList) << endl; } fout << "***Y coordinates***" << endl; for (list<double>::iterator itList = (myYs.begin()); itList != (myYs.end()); itList++) { fout << setiosflags(ios::fixed) << setprecision(2) << (*itList) << endl; } fout.close(); } randNbs(int dimension, double miu, double sigma, double min, double max) { srand((unsigned) (time(NULL))); for (int i = 0; i < dimension; i++) { double temp = NormalRandom(miu, sigma, min, max); myXs.push_back(temp); myYs.push_back(Normal(temp, miu, sigma)); } } protected: double AverageRandom(double min, double max) { int nbRand = rand() % 10001; return (min + nbRand*(max - min) / 10000); } double Normal(double x, double miu, double sigma) { return 1.0 / sqrt(2 * M_PI*sigma) * exp(-1 * (x - miu)*(x - miu) / (2 * sigma*sigma)); } double NormalRandom(double miu, double sigma, double min, double max) { double x; double dScope; double y; do { x = AverageRandom(min, max); y = Normal(x, miu, sigma); dScope = AverageRandom(0, Normal(miu, miu, sigma)); } while (dScope > y); return x; } list <double> myXs, myYs; }; int main() { randNbs *myNbs = new randNbs(500, 0, 1, -5, 5); myNbs->Display(); return 0; } |
它的matlab绘图结果如下:
曲线拟合结果:
而实际的正态分布是这样的:
还是mathematica好看,交互式界面
最后
以上就是粗心纸鹤为你收集整理的正态分布随机数生成的全部内容,希望文章能够帮你解决正态分布随机数生成所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复