Zufallszahl



  • Hey Leute,

    Ich habe das Problem bei srand das die Zufallszahlen von 1 - 50 immer aufsteigend generiert werden.

    Beispiel: 9, 14, 22, 32, 43, 50 und dann nochmal von vorne bloß mit anderen Zahlen.

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(void)
      {
        time_t t;
    
        time(&t);
        srand((unsigned int)t);              /* Zufallsgenerator initialisieren */
    
          cout << rand() % 50 + 1;     /* Wuerfeln */
      }
    

    Das Gleiche Problem auch hier.

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(void)
      {
        srand(time(NULL));              /* Zufallsgenerator initialisieren */
    
          cout << rand() % 50 + 1;     /* Wuerfeln */
      }
    

    Gibt es eine andere Möglichkeit? Ich habe gehört man keine einen random Zahlengenerator selber scripten. Könnte mir jemand eins schreiben?

    Ich bedanke mich für hilfreiche Antworten 🙂



  • Der Code passt nicht zu dem Problem.



  • Was Bashar meint ist, dass der Code nur eine Zahl ausgibt.



  • Soll es auch! Es gibt wie gesagt nach jedem neustart des Programmes 9, 14, 22, 32, 43, 50 aus. Halt beim ersten mal 9 schliesen start dann 14, schliesen start 22 u.s.w.



  • Dir wurde doch schon gesagt, dass du nur einmal srand aufrufen sollst, sonst kommt Müll raus. Wenn du dein Programm 5 Mal startest, dann rufst du 5 Mal srand auf -> 5 Mal Müll.



  • Dagegen macht man

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(void)
      {
        time_t t;
        time(&t);
        srand((unsigned int)t);rand();//Beim Initialisieren ein gleich einmal rand()
    
        cout << rand() % 50 + 1;
      }
    

    [/quote]



  • Und Nummer vier...



  • volkard schrieb:

    Dagegen macht man

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(void)
      {
        time_t t;
        time(&t);
        srand((unsigned int)t);rand();//Beim Initialisieren ein gleich einmal rand()
    
        cout << rand() % 50 + 1;
      }
    

    Das wird die Zahlen nur minimal besser machen.

    Mach lieber sowas:

    #include <iostream>
    #include <random>
    int main(){
        using namespace std;
        random_device rd;
        mt19937 mt(rd());
        uniform_int_distribution<int> dist(1, 50);
        cout << dist(mt);
    }
    

    Nathan schrieb:

    Und Nummer vier...

    Vielleicht gehen die weg wenn das Problem mal gelöst wird und man die Lösung mit vertretbarem Aufwand finden kann.



  • nwp3 schrieb:

    Nathan schrieb:

    Und Nummer vier...

    Vielleicht gehen die weg wenn das Problem mal gelöst wird und man die Lösung mit vertretbarem Aufwand finden kann.

    Sind doch immer andere...
    Ich find die Häufung nur gerade interessant.



  • Nathan schrieb:

    Ich find die Häufung nur gerade interessant.

    Das hat was mit Zufall zu tun 😉



  • volkard schrieb:

    Dagegen macht man

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(void)
      {
        time_t t;
        time(&t);
        srand((unsigned int)t);rand();//Beim Initialisieren ein gleich einmal rand()
    
        cout << rand() % 50 + 1;
      }
    

    Die generierten Zahlen sind irgendwie komisch.

    #include <iostream>
    #include <random>
    int main(){
        using namespace std;
        random_device rd;              //Ich bekomme hier einen Fehler?!
        mt19937 mt(rd());
        uniform_int_distribution<int> dist(1, 50);
        cout << dist(mt);
    }
    

    Wie ist dieser Script genau aufgebaut? Kann mir das jemand erklären?



  • Was soll "komisch" heissen?

    Der Code (nicht das Skript, und schon gar nicht "der Script") erzeugt zuerst ein Random-Device, dann eine Engine (also einen Zufallsgenerator) und eine Verteilung. Schau dir die entsprechenden Klassen auf www.cppreference.com an.

    Wenn random_device nicht gefunden wird, wird Hardware-Zufall vielleicht nicht unterstützt.



  • Erstmal vielen Dank für die schnellen Antworten 🙂

    Mit komisch meine ich schau mal wie oft du die Zahl 2 bekommst wenn du die 50 mit 3 austauscht. Fast garnicht.

    Ich wusste nicht das es Hardware abhängig ist 😮
    Was könnte bei mir das Problem sein?

    ACPI x86-basierter PC also 32bit Win7
    Prozessor: Intel(R) Core(TM)2Quad 2,33GHz
    Grafikkarte: NVIDIA GeForce 9400 GT



  • Es liegt nicht an der Hardware, deine Standardbibliothek unterstützt das nicht.
    Du brauchst also eine andere/neuere Version davon.



  • Welche den? Link?



  • Du brauchst random_device nicht zwingend.
    Nimm zum Seeden einfach time(nullptr), das sollte ausreichen™.



  • Chechen65 schrieb:

    Welche den? Link?

    Um es in deiner Sprache zu sagen: Deine C++ ist zu alt. Hier gibts ein aktuelleres.

    Nathan schrieb:

    Nimm zum Seeden einfach time(nullptr), das sollte ausreichen™.

    time(0) ist das Problem, nicht die Lösung.



  • #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main(void)
      {
        srand(time(nullptr));              /* Zufallsgenerator initialisieren */
    
          cout << rand() % 50 + 1;     /* Wuerfeln */
      }
    

    Meinst du so? Denn so ist das falsch 😃



  • nwp3 schrieb:

    Nathan schrieb:

    Nimm zum Seeden einfach time(nullptr), das sollte ausreichen™.

    time(0) ist das Problem, nicht die Lösung.

    Ich bezweifle, dass chechen Programme schreibt, bei denen es darauf ankommt.



  • Ich nutze das Visual Studio 2013 Ultimate!
    Und random_device rd; funktioniert bei mir nicht. Ich nehme an ein roter Punkt neben der Zeile meint das 🙂

    Was kann ich machen? Nathan ich weis nicht wie ich time(nullptr) einsetzen soll?!
    Da müsstest du mir genauer sagen.


Log in to reply