Zufallszahlen mit zwei Nachkommastellen



  • Hallo,

    ich möchte eine Ausgabe generieren, die mir Zufallswerte mit zwei Nachkommastellen liefert in folgenden Bereichen:

    -5 bis +25
    10 bis 95
    15 bis 35

    Wie kann ich das am besten realisieren?

    Gruß



  • Mit einem Pseudozufallsgenerator. Was hast du bislang schon?



  • generiere einfach ganzzahlige Zufallszahlen in größerem Bereich und teile durch 100.



  • Ich habe bisher noch nichts, da ich noch keine Musterlösung gefunden habe, die ich weiterbenutzen und verändern kann.

    Problematisch stelle ich mir die Sache mit dem negativen Zahlenbereich vor.



  • julianpe schrieb:

    Ich habe bisher noch nichts, da ich noch keine Musterlösung gefunden habe, die ich weiterbenutzen und verändern kann.

    Dann kannst du ja mal versuchen, es von Grund auf selbst zu schreiben. 😉

    julianpe schrieb:

    Problematisch stelle ich mir die Sache mit dem negativen Zahlenbereich vor.

    Das ist einfach. Wenn du Zahlen im Bereich von 0 bis 30 hast und davon 5 abziehst, in welchem Bereich sind sie dann?



  • .. ist doch 'ne nette Übung 😉

    Mit C++11 ginge das z.B. so:

    #include <iostream>
    #include <random>
    #include <iomanip>
    
    class Zufall
    {
    public:
        Zufall( double von, double bis, double delta )
            : m_verteilung( int( von / delta + 0.5 ), int( bis / delta + 0.5 ) )
            , m_generator( 201411 )  // hier evt. die aktuelle Zeit benutzen
            , m_delta( delta )
        {}
        double operator()()
        {
            return m_delta * m_verteilung( m_generator );
        }
    private:
        std::uniform_int_distribution<> m_verteilung;
        std::mt19937 m_generator;
        double m_delta;
    };
    
    int main()
    {
        using namespace std;
        Zufall zufall( -5, 25, 0.01 );
        for( int i = 0; i < 30; ++i )
            cout << setw(8) << zufall() << endl;
        return 0;
    }
    

    und vor C++11 ging das noch so:

    #include <iostream>
    #include <iomanip>
    #include <cmath>    // std::floor
    #include <cstdlib>  // std::rand, RAND_MAX
    
    class Zufall
    {
    public:
        Zufall( double von, double bis, double delta )
            : m_von( von )
            , m_scale( (bis - von) / (delta * (RAND_MAX+1.0)) )
            , m_delta( delta )
        {}
        double operator()()
        {
            return m_von + m_delta * std::floor( m_scale * std::rand() + 0.5 );
        }
    private:
        double m_von;
        double m_scale;
        double m_delta;
    };
    
    int main()
    {
        using namespace std;
        Zufall zufall( -5, 25, 0.01 );
        for( int i = 0; i < 30; ++i )
            cout << setw(8) << zufall() << endl;
        return 0;
    }
    

    siehe auch http://www.c-plusplus.net/forum/p1202571



  • Ich fühle mich erinnert an die Folien 27 bis 30 von http://de.slideshare.net/rawwell/iteratorsmustgo 😉


  • Mod

    Werner Salomon schrieb:

    [code="cpp"]
    , m_generator( 201411 ) // hier evt. die aktuelle Zeit benutzen

    Es gibt in C++11 doch auch schoenere Quellen fuer Seeds. Sei es eines der Devices fuer echte Zufallszahlen oder eine der Seedklassen, die Entropie aus mehreren Quellen zu einem guten Seed verhashen.



  • SeppJ schrieb:

    Werner Salomon schrieb:

    , m_generator( 201411 )  // hier evt. die aktuelle Zeit benutzen
    

    Es gibt in C++11 doch auch schoenere Quellen fuer Seeds. Sei es eines der Devices fuer echte Zufallszahlen oder eine der Seedklassen, die Entropie aus mehreren Quellen zu einem guten Seed verhashen.

    .. dann erwähne doch mal eine dieser Quellen, und zeige, wie man das einsetzt.
    Die Leser dieses Forums lernen sicher gerne etwas dazu 😉


  • Mod

    Werner Salomon schrieb:

    SeppJ schrieb:

    Werner Salomon schrieb:

    , m_generator( 201411 )  // hier evt. die aktuelle Zeit benutzen
    

    Es gibt in C++11 doch auch schoenere Quellen fuer Seeds. Sei es eines der Devices fuer echte Zufallszahlen oder eine der Seedklassen, die Entropie aus mehreren Quellen zu einem guten Seed verhashen.

    .. dann erwähne doch mal eine dieser Quellen, und zeige, wie man das einsetzt.
    Die Leser dieses Forums lernen sicher gerne etwas dazu 😉

    Hatte keine Zeit, dachte die Stichworte reichen. Seeden mit Echtzufall:

    std::default_random_engine rng((std::random_device())());
    

    Seeden mit Seed sequence:

    std::seed_seq seq{time(0), getpid()};
        std::uint32_t seeds[1];
        seq.generate(seeds, seeds+1);
    
        std::default_random_engine e1(seeds[0]);
    

    Letzteres ist ein bisschen umstaendlich. Wie der Name schon verraet ist seed_seq eigentlich fuer das Generieren vieler Seeds gut (z.B. fuer parallele Anwendungen). wenn man nur einen einzigen Seed will, muss man dafuer aber eben trotzdem Code schreiben, der auch mehr haette generieren koennen.


Log in to reply