zufällige Zahl von 1 bis 4



  • Ja, im einfachsten Fall holst du dir per rand() eine Zufallszahl und skalierst sie auf deinen gewünschten Zahlenbereich.



  • silvermain1104 schrieb:

    ... kann mir nicht mal jemand schnell sagen wie ich das programmiere.

    Danke!!

    Bitte:

    // -- File: Zufall.h
    #ifndef ZUFALL_H_INCLUDED_
    #define ZUFALL_H_INCLUDED_
    #include <cstdlib>  // rand()
    #include <ctime>    // time()
    
    void init_rand()
    {
        static bool randInitialized = false;
        if( !randInitialized )
        {
            using namespace std;
            srand( time(0) );
            rand();
            randInitialized = true;
        }
    }
    
    template< typename T >
    class Zufall
    {
    public:
        typedef T value_type;
    
        Zufall( value_type von, value_type bis )
            : m_start( von )
            , m_faktor( (bis - von) / (1.0 + RAND_MAX) )
        {
            init_rand();
        }
        value_type operator()()
        {
            using namespace std;
            return m_start + value_type( rand() * m_faktor );
        }
    private:
        value_type m_start;
        double m_faktor;
    };
    #endif  // ZUFALL_H_INCLUDED_
    

    und die Anwendung:

    #include "Zufall.h"
    #include <iostream>
    
    int main()
    {
        using namespace std;
        Zufall< int > z( 1, 5 ); // 1..4 := halboffenes Intervall [1;5)
        for( int n=10; n; --n )  // 10 Zufallszahlen
            cout << z() << endl;
        return 0;
    }
    

    Gruß
    Werner

    Edit: Bugfix - falls T ein int-Typ ist und 'von' < 0 war die Verteilung falsch.
    Zeile 34 war vorher 'return value_type( m_start + rand() * m_faktor );'



  • Danke Werner hast mir echt geholfen. 😃



  • Oder so:

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main()
    {
        srand(time(NULL));  //rand() erzeugt nur Pseudo-Zufallszahlen.
                            //Hier setze ich den Start-Wert von rand()
                            //Auf die aktuelle Zeit.
    
        cout<<rand() % 4 + 1;  //der Modulo-Operator % Gibt den Rest einer
                               //Ganzzahlen-Division zurück.
                               //Man teile(modulo) rand() durch 4 und addiere
                               //1, schon bekommt man ein Zahl von 1-4.
    
        return 0;
    }
    


  • danke ne0r,
    das is ja noch besser. 😃



  • silvermain1104 schrieb:

    danke ne0r,
    das is ja noch besser. 😃

    .. das ist eine Frage des Gütekriteriums 😉

    Gruß
    Werner



  • Werner Salomon schrieb:

    silvermain1104 schrieb:

    danke ne0r,
    das is ja noch besser. 😃

    .. das ist eine Frage des Gütekriteriums 😉

    Ich hätte es jetzt eher "Perlen vor die Säue" genannt, aber auch o.k. 😉

    Netter Artikel zu rand und ko: http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx



  • int einsbisvier = (rand() >> (sizeof(int) * 8 - 2)) + 1;



  • Und falsch.



  • Stimmt ist falsch. Vom Prinzip aber richtig. 😉
    Muss man eben sizeof(int) * 8 durch die Position des hoechsten gesetzten Bits in RAND_MAX ersetzen - entweder als Konstate oder als Template das nacher niemand mehr versteht.


Anmelden zum Antworten