[closed/solved] Kann mir wer Boost.Random erklären?


  • Administrator

    Oder erklären wieso das folgende immer die gleichen Ergebnisse liefert:

    #include <ctime>
    #include <cstdlib>
    #include <iostream>
    
    int main()
    {
        std::srand(std::clock());
    
        for(int i = 0; i < 1000; ++i)
        {
            std::cout << std::rand() << ' ' << std::endl;
        }
    
        return 0;
    }
    

    Ich bekomme aus irgendeinem mir unerklärlichen Grund immer die gleichen tausend verschiedenen Zahlen raus. Zudem sind diese tausend verschiedene mir zu wenig verschieden.

    Daher wollte ich Boost.Random benutzen, doch die Dokumentation dazu scheint mir miserabel zu sein oder ich versteh einfach kein Wort. Kann mir jemand sagen, wie ich einfach ein paar zufällige Integers mit Boost.Random bekommen kann? Am besten auch positiv und negativ, wenn es geht.

    Danke im voraus.

    Grüssli



  • std::srand(std::clock());
    

    ahm clock() ist die falsche funktion.

    das muss

    std::srand(std::time(null));
    

    heissen.

    clock gibt nur die bisherige programmlaufzeit aus, nicht die aktuelle zeit. Das erklärt, warum du immer dieselben Ergebnisse heraus bekommen hast.

    Und wo ist nun *genau* dein Problem mit boost::random? ist doch recht schön erklärt.


  • Administrator

    otze schrieb:

    ahm clock() ist die falsche funktion.

    das muss

    std::srand(std::time(null));
    

    heissen.

    clock gibt nur die bisherige programmlaufzeit aus, nicht die aktuelle zeit. Das erklärt, warum du immer dieselben Ergebnisse heraus bekommen hast.

    Das erklärt so einiges 😃
    Kenne mich zu wenig mit den C-Funktionen aus, noch ein Grund mehr auf die C++ Funktionen, bzw. Boost zu setzen.

    otze schrieb:

    Und wo ist nun *genau* dein Problem mit boost::random? ist doch recht schön erklärt.

    Recht schön? Entweder les ich die falsche Dokumentation oder wir haben unterschiedliche Ansichten was schön ist 😃
    Ich sehe drei Dinger in der Dokumentation, eine Schnelleinführung, eine Dokumentation des Konzepts und Code-Referenzen.

    Beginnen wir mit der Schnelleinführung, welche nur aus einem Programmcode besteht, der für mich extrem unverständlich ist. Zumindest verstehe ich das Konzept nicht, wie es funktionieren soll.

    Also auf zur Dokumentation über das Konzept, welches ich irgendwie nicht verstehe. Ich bekomme irgendwie nicht den Zusammenhang raus, wie ich was mit was kombinieren muss um meine Ergebnisse zu erhalten.

    Die Code-Referenz bringt mir dann auch nichts mehr 😉

    Also ganz einfach, ich versteh das Konzept von Boost.Random nicht.

    Danke.

    Grüssli





  • //der Algorithmus (hier der Mersenne Twister Algo)
        boost::mt19937 generator;
        //Gleichverteilte Ganzzahlen zwischen -50 und 50
        boost::uniform_int<int> distrubution(-50,50);
        //der Generator, erzeugt gleichverteilte Ganzahlen -50..50 mit dem MT-Algo
        boost::variate_generator<boost::mt19937, boost::uniform_int<int> > rand(generator, distrubution);
    
        for(int i = 0; i < 20; ++i)
        {
            std::cout << rand() << '\n';
        }
    

  • Administrator

    Danke!
    Ich weiss zwar nicht wieso, aber irgendwie hat sich der Knopf gelöst und es wurde mir so klar, dass es mir fast peinlich ist überhaupt die Frage gestellt zu haben 🙂

    Die Sache ist so einfach aufgebaut, aber irgendwie hatte ich es nicht geschnallt.

    Hab mir nun daraus meine eigene Random-Klasse (Wrapper) gebaut und das funktioniert alles super perfekt, genau wie ich es wollte. Endlich kann ich meine Whitebox-Tests fortführen.

    //////////////////////////////////////////////////////////////////////////
    // CRandom
    
    template<typename TValue>
    class CRandom
    {
    	// Attributes //
    private:
    	boost::variate_generator<boost::mt19937, boost::uniform_int<TValue>> m_Generator;
    
    	// Constructors & Destructor //
    public:
    	CRandom(TValue Min, TValue Max)
    		: m_Generator(boost::mt19937(), boost::uniform_int<TValue>(Min, Max))
    	{ }
    
    	~CRandom() { };
    
    	// Methods //
    public:
    	TValue get_next_value() { return m_Generator(); };
    };
    

    Grüssli


Anmelden zum Antworten