C++ 在类中使用boost::math::distribution

C++ 在类中使用boost::math::distribution,c++,boost,statistics,C++,Boost,Statistics,我已经做了一个非常简单的程序,应该可以得到不同分布的分位数。在我的主文件中,我为每个分布创建了一个类对象,然后在类中使用设置void来设置每个分布的参数(例如,对于正态分布,我要设置均值和方差)。然后,我想通过调用GetDraw以调用double时指定的置信区间来计算分位数值 我使用boost包进行分发 问题是,如果我使用类而不是直接将值打印到控制台,那么对于某些分布,我会得到不同的值(第一个值是我从类中得到的值,第二个值是我在没有类的情况下得到的值): 你知道我为什么会得到这个奇怪的结果吗 这

我已经做了一个非常简单的程序,应该可以得到不同分布的分位数。在我的主文件中,我为每个分布创建了一个类对象,然后在类中使用
设置void
来设置每个分布的参数(例如,对于正态分布,我要设置均值和方差)。然后,我想通过调用
GetDraw
以调用
double
时指定的置信区间来计算分位数值

我使用
boost
包进行分发

问题是,如果我使用类而不是直接将值打印到控制台,那么对于某些分布,我会得到不同的值(第一个值是我从类中得到的值,第二个值是我在没有类的情况下得到的值):

你知道我为什么会得到这个奇怪的结果吗

这是我的主页。cpp:

#include <iostream>
#include <random>
#include <boost/math/distributions.hpp>

#include "Random.h"

int main()
    {
        double q;

        //NORMAL
        Normaldist RandomNormal;
        RandomNormal.Setup(0, 1);
        q = RandomNormal.GetDraw(0.95);
        std::cout << "Normal: " << q << std::endl;

        boost::math::normal dist(0.0, 1.0); //https://stackoverflow.com/questions/5565228/quantile-functions-in-boost-c
        q = quantile(dist, 0.95);
        std::cout << "Normal: " << q << std::endl;


        //Binomial
        Binomialdist RandomBinomial;
        RandomBinomial.Setup(509, 0.8);
        q = RandomBinomial.GetDraw(0.95);
        std::cout << "Binomal: " << q << std::endl;

        q = quantile(boost::math::binomial(509, 0.8), 0.95);
        std::cout << "Binomal: " << q << std::endl;


        //BETA
        Betadist RandomBeta;
        RandomBeta.Setup(1, 0.1);
        q = RandomBeta.GetDraw(0.95);
        std::cout << "Beta: " << q << std::endl;

        q = boost::math::ibeta_inv(1, 0.1, 0.95);
        std::cout << "Beta: " << q << std::endl;


        //Exponential
        Exponentialdist RandomExp;
        RandomExp.Setup(2);
        q = RandomExp.GetDraw(0.95);
        std::cout << "exponential_distribution: " << q << std::endl;

        const auto lbda = 2.0;
        q = quantile(boost::math::exponential_distribution<> { lbda }, 0.95);
        std::cout << "exponential_distribution: " << q << std::endl;

    return(0);
    }
#包括
#包括
#包括
#包括“Random.h”
int main()
{
双q;
//正常的
Normaldist随机化normal;
随机正常设置(0,1);
q=RandomNormal.GetDraw(0.95);

std::cout您的设置函数没有做任何事情。您似乎使它变得比需要的更复杂。我正在尝试设置参数,以便以后可以访问分发版,而无需再次指定它们。
#include <iostream>
#include <random>
#include <boost/math/distributions.hpp>

#include "Random.h"

int main()
    {
        double q;

        //NORMAL
        Normaldist RandomNormal;
        RandomNormal.Setup(0, 1);
        q = RandomNormal.GetDraw(0.95);
        std::cout << "Normal: " << q << std::endl;

        boost::math::normal dist(0.0, 1.0); //https://stackoverflow.com/questions/5565228/quantile-functions-in-boost-c
        q = quantile(dist, 0.95);
        std::cout << "Normal: " << q << std::endl;


        //Binomial
        Binomialdist RandomBinomial;
        RandomBinomial.Setup(509, 0.8);
        q = RandomBinomial.GetDraw(0.95);
        std::cout << "Binomal: " << q << std::endl;

        q = quantile(boost::math::binomial(509, 0.8), 0.95);
        std::cout << "Binomal: " << q << std::endl;


        //BETA
        Betadist RandomBeta;
        RandomBeta.Setup(1, 0.1);
        q = RandomBeta.GetDraw(0.95);
        std::cout << "Beta: " << q << std::endl;

        q = boost::math::ibeta_inv(1, 0.1, 0.95);
        std::cout << "Beta: " << q << std::endl;


        //Exponential
        Exponentialdist RandomExp;
        RandomExp.Setup(2);
        q = RandomExp.GetDraw(0.95);
        std::cout << "exponential_distribution: " << q << std::endl;

        const auto lbda = 2.0;
        q = quantile(boost::math::exponential_distribution<> { lbda }, 0.95);
        std::cout << "exponential_distribution: " << q << std::endl;

    return(0);
    }
#ifndef RANDOM_H_INCLUDED
#define RANDOM_H_INCLUDED

#include <iostream>
#include <random>
#include <boost/math/distributions.hpp>

class DistributionClass {
            protected:
                boost::math::normal_distribution<> NormalDistribution; //https://stackoverflow.com/questions/5565228/quantile-functions-in-boost-c
                boost::math::binomial_distribution<> BinomialDistribution; //https://valelab4.ucsf.edu/svn/3rdpartypublic/boost/libs/math/doc/sf_and_dist/html/math_toolkit/dist/dist_ref/dists/binomial_dist.html
                boost::math::beta_distribution<> BetaDistribution;
                boost::math::exponential_distribution<> ExponentialDistribution;
        };

        class Normaldist: public DistributionClass {
            public:
                void Setup(double mean, double variance);
                double GetDraw(double r);
        };

        class Binomialdist: public DistributionClass {
            public:
                void Setup(double n, double p);
                double GetDraw(double r);
        };

        class Betadist: public DistributionClass {
            public:
                void Setup(double a, double b);
                double GetDraw(double r);
        };

        class Exponentialdist: public DistributionClass {
            public:
                void Setup(double lbda);
                double GetDraw(double r);
        };
#include <iostream>
#include <random>
#include <boost/math/distributions.hpp>

#include "Random.h"


    void Normaldist::Setup(double mean, double variance) {
        boost::math::normal_distribution<> NormalDistribution(mean, variance);
    }

    double Normaldist::GetDraw(double r) {
        return(quantile(NormalDistribution, r));
    }


    void Binomialdist::Setup(double n, double p) {
        boost::math::binomial_distribution<> BinomialDistribution(n, p);
    }

    double Binomialdist::GetDraw(double r) {
        return(quantile(BinomialDistribution, r)); //boost::math::binomial(509, 0.8)
    }


    void Betadist::Setup(double a, double b) { //boost.org/doc/libs/1_51_0/libs/math/doc/sf_and_dist/html/math_toolkit/dist/dist_ref/dists/beta_dist.html
        boost::math::beta_distribution<> BetaDistribution(a, b);
    }

    double Betadist::GetDraw(double r) {
        return(quantile(BetaDistribution, r));
    }


    void Exponentialdist::Setup(double lbda) {
        boost::math::exponential_distribution<> ExponentialDistribution(lbda);
    }

    double Exponentialdist::GetDraw(double r) { //https://stackoverflow.com/questions/38201740/generate-a-exponential-distribution-for-a-set-of-data-using-boost-c
        return(quantile(ExponentialDistribution, r));
    }

    #endif // RANDOM_H_INCLUDED