我是靠谱客的博主 粗心纸鹤,最近开发中收集的这篇文章主要介绍正态分布随机数生成,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

昨天给啸啸讲题的时候说到了正态分布,今天又正巧看到了公式,那么就自己生成了一下符合正态分布的随机数。

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(50001, -55);
    myNbs->Display();
    return 0;
}

它的matlab绘图结果如下:


曲线拟合结果:


而实际的正态分布是这样的:


还是mathematica好看,交互式界面


最后

以上就是粗心纸鹤为你收集整理的正态分布随机数生成的全部内容,希望文章能够帮你解决正态分布随机数生成所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部