TINV in C++




  • Mod

    Caligulaminus schrieb:

    http://en.cppreference.com/w/cpp/numeric/random/student_t_distribution

    Das ist aber ein Generator, nicht der Wert der Verteilungsfunktion.



  • Das war mehr ein Kommentar zu seldons Antwort. Ist boost::math::students_t etwas anderes als std::boost::math::student_t_distribution?



  • SeppJ schrieb:

    Das ist aber ein Generator

    Generator nicht. Das Ding ist für die Distribution zuständig.
    Aber wenn's am Thema vorbeigeht, will ich nichts gesagt haben.


  • Mod

    cooky451 schrieb:

    Das war mehr ein Kommentar zu seldons Antwort. Ist boost::math::students_t etwas anderes als std::boost::math::student_t_distribution?

    Ja, das sind zwei ganz verschiedene Funktionalitäten. Das ist wie der Unterschied zwischen std::exponential_distribution und std::exp. Größer sogar noch, weil boost::math::students_t wesentlich mächtiger ist, als nur ein paar Funktionswerte zu berechnen.

    Caligulaminus schrieb:

    SeppJ schrieb:

    Das ist aber ein Generator

    Generator nicht. Das Ding ist für die Distribution zuständig.

    Wenn du dich an der Formulierung störst: Es ist ein Aufsatz für einen Zufallsgenerator.



  • SeppJ schrieb:

    cooky451 schrieb:

    Das war mehr ein Kommentar zu seldons Antwort. Ist boost::math::students_t etwas anderes als std::boost::math::student_t_distribution?

    Ja, das sind zwei ganz verschiedene Funktionalitäten. Das ist wie der Unterschied zwischen std::exponential_distribution und std::exp.

    Hm.. okay, ich dachte es wäre ähnlich, weil er es "dist" genannt hat. 😉



  • Super, vielen Dank! Ich werde dann einfach

    boost::math::students_t TDist(NuT); // create t-distribution object
    X = boost::math::quantile(TDist, Y);
    

    benutzen. Das funktioniert in der Main() soweit jetzt auch, wie würde das dann in einer Klasse aussehen? Hintergrund ist, dass ich eine Klasse "RVGenerator" habe, die bei Aufruf von "generateStudentT()" einen t-verteilten Wert X zurückgibt:

    class RVGenerator
    {
    public:  
    boost::math::students_t TDist(double v);
    double X;
    double Y;
    }
    

    Hier der Konstruktor, der ein Objekt für die Verteilung erstellen soll:

    RVGenerator::RVGenerator(double NuT)
    {
    boost::math::students_t TDist(NuT); // create t-distribution object
    }
    

    Und hier die Memberfunktion, die aus diesem Objekt dann die quantile()-Funktion aufrufen soll:

    void RVGenerator::generateStudentT()
    {
    X = boost::math::quantile(TDist, Y);
    }
    

    So funktioniert das nicht, aber mit meinem Basiswissen was C++ anbetrifft weiss ich nicht was dort falsch sein sollte..?



  • Wo bekommt Y seinen Wert?



  • Y erstelle ich vorher mithilfe dem Zufallsgenerator MersenneTwister (Funktion genrand_real2()) und forme sie dann mit einem Algorithmus zu einer T-Verteilung um.
    Was mir auffällt ist, dass wenn (so wie oben) das Objekt "boost::math::students_t TDist(NuT)" im Konstruktor erstellt wird funktioniert es nicht. Wenn ich es jedoch jedes Mal in der Memberfunktion direkt vor der quantil-Funktion neu erstelle, funktioniert es.



  • RVGenerator::RVGenerator(double NuT)
    {
    boost::math::students_t TDist(NuT); // create t-distribution object
    }

    Du weißt schon, dass Du hier einfach ein lokales Objekt TDist erstellst, was nach dem constructor schon wieder stirbt? Es führt nicht zu Namenskonflikt, weil es in einem engeren Scope ist und somit (würdest Du es direkt nutzen) das Attribut TDist verdeckt.

    Initialisiere TDist so:

    RVGenerator::RVGenerator(double NuT)
        : TDist(NuT)
    {
    }
    

    Zudem solltest Du Dir das Konzept Kapselung anschauen. Attribute sollten private sein. Benötigt eine andere Klasse Zugriff, gibt es dafür Getter und Setter.

    boost::math::students_t TDist(double v);
    

    Und wenn Du das so wie getan in die Klasse schreibst, ist es eine Funktionsdefinition. Weg mit dem (double v), dann deklarierst Du es als Attribut.


Anmelden zum Antworten