Zufallszahl



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



  • Chechen65 schrieb:

    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.

    http://ideone.com/kWiOQi
    sieht für mich fair aus.

    edit:
    http://en.wikipedia.org/wiki/Clustering_illusion



  • Das hängt vor allem von der Testmenge ab. Wenn du sechs mal würfelst heißt das ja nicht, dass jede Augenzahl ein mal vorgekommen ist, nur weil die Wahrscheinlichkeit 1:6 ist. Würfel ein paar tausend Mal und guck, wie dann die Verteilung aussieht.

    #include <ctime>
    #include <ctime>
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        srand( time( 0 ) );
        unsigned int Counter[6] = { 0,0,0,0,0,0 };
        for( unsigned int i = 0; i < 100000; ++i )
        {
           Counter[rand() % 6]++;
        }
        for( unsigned int i = 0; i < 6; ++i )
        {
           cout << "Augenzahl " << i +1 << " wurde " << Counter[i] << " gewürfelt\n";
        }
    }
    

    Sieht bei mir nicht "komisch" aus...



  • DocShoe schrieb:

    #include <ctime>
    #include <ctime>
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        srand( time( 0 ) );
        unsigned int Counter[6] = { 0,0,0,0,0,0 };
        for( unsigned int i = 0; i < 100000; ++i )
        {
           Counter[rand() % 6]++;
        }
        for( unsigned int i = 0; i < 6; ++i )
        {
           cout << "Augenzahl " << i +1 << " wurde " << Counter[i] << " gewürfelt\n";
        }
    }
    

    Sieht bei mir nicht "komisch" aus...

    Änder mal die 100000 in 6 um, starte das Programm paar mal und schau dir die Zahlen an. Also ich hab ja schon 20 Mal gestartet und sie zeigt mir nicht einmal die 6.

    DocShoe schrieb:

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

    Ich denke du weist das ich Anfänger bin? 🙂
    Wie den?



  • Chechen65 schrieb:

    Ich denke du weist das ich Anfänger bin? 🙂

    Ja, aber auch von Anfängern erwarte ich, dass sie sich selbst in ein Thema einarbeiten können. In deinem Fall wäre das Datei-Ein-/Ausgabe. Kann gut sein, dass das im Moment noch nicht angebracht ist, aber dann musst du eben deine Ziele niedriger setzen. Zum Beispiel indem du Zufallszahlen so generierst, wie es üblich ist -- nicht eine einzelne Zahl pro Programmaufruf.

    Was den Zustand angeht, zähle z.B. die Anzahl Aufrufe von operator() mit und speichere sie. Beim Laden kannst du mit discard() zum entsprechenden Zustand vorrücken.



  • Chechen65 schrieb:

    Änder mal die 100000 in 6 um, starte das Programm paar mal und schau dir die Zahlen an. Also ich hab ja schon 20 Mal gestartet und sie zeigt mir nicht einmal die 6.

    Und welche Zahl ergibt Modulo 6 wieder 6?

    Du bist so doof dass es weh tut.



  • Nexus schrieb:

    Was den Zustand angeht, zähle z.B. die Anzahl Aufrufe von operator() mit und speichere sie. Beim Laden kannst du mit discard() zum entsprechenden Zustand vorrücken.

    Ok, vielen Dank. Ich werd nach schauen was ich damit anfangen kann.



  • Chechen65 schrieb:

    DocShoe schrieb:

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

    Das Zitat kommt nicht von mir.

    qweasdyxc schrieb:

    Und welche Zahl ergibt Modulo 6 wieder 6?

    Du bist so doof dass es weh tut.

    Klassisches Eigentor. Guck dir den Code lieber genauer an, bevor du andere Leute beleidigst. In der Tat werden zum Zählen nur Zahlen zwischen 0 und 5 erzeugt, aber die Ausgabe addiert 1, um auf die Augenzahlen 1 bis 6 zu kommen.



  • Ich hab das Problem gelöst.
    Ich habe das Fenster immer mit dem X oben rechts beendet. Anstatt es mit Enter etc. zu beenden. Deswegen kamen so komische Zahlen raus, srand(time(NULL)) reicht völlig aus 😃 Tut mir leid Leute....



  • Häh?



  • Chechen65 schrieb:

    Ich hab das Problem gelöst.
    Ich habe das Fenster immer mit dem X oben rechts beendet. Anstatt es mit Enter etc. zu beenden. Deswegen kamen so komische Zahlen raus, srand(time(NULL)) reicht völlig aus 😃 Tut mir leid Leute....

    Ob du Enter drückst oder Das Fenster schließt (und damit das Programm) sollte in dem Fall weniger als keine Auswirkungen auf folgende Programmstarts haben...



  • Skym0sh0 schrieb:

    Ob du Enter drückst oder Das Fenster schließt (und damit das Programm) sollte in dem Fall weniger als keine Auswirkungen auf folgende Programmstarts haben...

    Das hat mich auch komischerweise gewundert.



  • Chechen65 schrieb:

    Skym0sh0 schrieb:

    Ob du Enter drückst oder Das Fenster schließt (und damit das Programm) sollte in dem Fall weniger als keine Auswirkungen auf folgende Programmstarts haben...

    Das hat mich auch komischerweise gewundert.

    Und daraus folgern wir, dass du entweder an anderer Stelle einen Fehler gemacht hast oder eine Folge von sehr unwahrscheinlichen Fällen (in dem Fall Zahlen) dich heimgesucht hat.


Anmelden zum Antworten