Zufallszahl



  • 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.



  • bei visual studio ist ein roter punkt neben dem code ein breakpoint.



  • Ja in der Zeile ist ein Fehler random_device rd funzt nicht, was tun?



  • Wenn es wirklich nicht kompiliert (und ich mein nicht, wenn IntelliSense das unterschlängelt oder so, wenn es nicht kompiliert), dann machst du folgendes:

    int main(){
        using namespace std;
        mt19937 mt(time(nullptr));
        uniform_int_distribution<int> dist(1, 50);
        cout << dist(mt);
    }
    


  • Erstens: Dein OP gibt mir unter Win8 und dem GCC folgende Zufallszahlen:

    37
    22
    5
    41
    26
    26
    26
    9
    9
    45
    45
    45
    30
    13
    13
    13
    13
    13
    49
    49
    49
    34
    34
    34
    34
    17
    17
    17
    2
    

    Jede einzelne durch eine Programmaufruf erzeugt. Sieht recht zufällig aus und vor allem NICHT auf- oder absteigend.

    Zweitens:
    Lies dir die Referenzseiten zum Thema Zufallsgeneratoren durch, da wird alles erklärt. Und zum Thema srand/rand gibt es auch hier im Forum genug Threads, heute mittag wurde mal wieder einer der aktuellen gelöst.

    Drittens: Wie lernst du C++? Buch, Youtube oder Try&Error?

    Viertens: Wasdeine IDE sagt ist egal, es kommt drauf an, was der Compiler sagt.



  • Ich weis nicht welchen Quellcode du genomen hast, aber ich glaube diesem trifft komisch zu 🙂

    Mein Buch : C++: Objektorientiertes Programmieren von Anfang an
    Link: http://www.amazon.de/C-Objektorientiertes-Programmieren-von-Anfang/dp/3499600773/ref=sr_1_2?ie=UTF8&qid=1395861514&sr=8-2&keywords=c%2B%2B+Programmieren+von+Anfang+an+b%C3%BCcher

    Jetzt erst sehe ich wie "alt" mein C++ ist 🙂
    Visual verlangt das ich anstatt getch(); _getch. schreibe....

    Ich habe sehr viel nur mit Dev-C++ gearbeitet und komme mit Visual Studio nicht klar.

    Visual Studio erstellt einen Ordner mit vielen Dateien drinnen.
    Und ich weis nicht mit z.B. Externe Abhängigkeiten, Headerdateien, Ressourcendateien anzufangen...
    Wo lerne ich das?

    Ich fange jetzt an mich mit der Seite C++ reference zu beschäftigen was von euch Vorgeschlagen wurde.

    Nochmal danke an euch 🙂



  • Chechen65 schrieb:

    Jetzt erst sehe ich wie "alt" mein C++ ist 🙂
    Visual verlangt das ich anstatt getch(); _getch. schreibe....

    Das hat nichts mit alt zu tun. getch ist keine Standard-Funktion, bei dem einen Compiler heißt sie getch, beim nächsten _getch und der nächste hat sie überhaupt nicht.

    Visual Studio erstellt einen Ordner mit vielen Dateien drinnen.
    Und ich weis nicht mit z.B. Externe Abhängigkeiten, Headerdateien, Ressourcendateien anzufangen...
    Wo lerne ich das?

    Kannst du erstmal ignorieren. Oder löschen.



  • Chechen65 schrieb:

    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.

    Ja, sie sind zufällig. Zufälligere wirste erstmal nicht finden. Was genau stört Dich? Mach mal %6 und schreib sie auf und nimm einen echten Würfel und schreib sie auf. Sind die echten nund komischer oder die unechten?



  • Nathan schrieb:

    int main(){
        using namespace std;
        mt19937 mt(time(nullptr));
        uniform_int_distribution<int> dist(1, 50);
        cout << dist(mt);
    }
    

    Hast du es ausprobiert? von eins bis 6 zeigt es Zahlen wie schon gesagt aufsteigend an. Ist es so schwer einen Zahlengenerator zu schreiben?

    Ich habe gewürfelt und es waren echt zufälligere als bei dem Quellcode 😃
    Ich hab alles ausprobiert und man kann immer erahnen welche Zahl generiert werden wird von 1 - 6.
    Was ich sagen kann ist das mit dem Quellcode z.B. die chance eine 1 zubekommen nicht 1 zu 6 steht.



  • Was hast du überhaupt vor?
    Ein Programm zu schreiben, was exakt eine "Zufalls-"Zahl ausgibt und mehr nicht macht??



  • Ein Zufallsgenerator ist nur gut, wenn du eine fortlaufende Sequenz erzeugst. Nicht wenn du ihn ständig neu initialisierst. Wurde aber schon mehrmals im Bezug auf srand() gesagt, hier ist die gleiche Problematik.

    Wenn du pro Programmaufruf eine Zufallszahl willst, speichere den Zustand des Zufallsgenerators in eine Datei.


Anmelden zum Antworten