"Befehl" : rand / srand



  • FreakY<3Cpp: hast wohl noch nie "Die Siedler von Catan" gespielt?



  • knivil schrieb:

    wurf_summe = (rand()%6) + (rand()%6); //oder gleich rand()%12
    

    Nein, ist nicht das gleiche, und zwar in vielerlei Hinsicht.

    Hat ich auch zuerst gedacht, denn ob mein jetzt ein Würfel mit 12 Augen, oder 2 Würfel mit jeweils 6 Augen würfelt, ist ein unterschied, aber ich weiß ja nicht ob der OP Wert darauflegt.
    @Th69, nein tut mir Leid, ich kenne es auch nicht.


  • Administrator

    Th69 schrieb:

    Als Erklärung:
    Du hast jetzt beidesmal den selben Seed benutzt (da sich die Zeit (in Sekunden) zwischen den beiden time-Aufurfen nicht geändert hat).

    Weisst du was lustig ist? Wenn er den verlinkten Thread gelesen hätte, welcher FreakY<3Cpp angegeben hat, dann wäre ihm das selber aufgefallen, denn es steht explizit drin. Wieso lesen die Leute nicht, was man ihnen als Hilfe gibt? 😕

    Grüssli



  • Dravere schrieb:

    Wieso lesen die Leute nicht, was man ihnen als Hilfe gibt? 😕

    Wenn sie lesen würden, hätten wir hier wohl um einiges weniger Threads.



  • Würfel mit 12 Augen, oder 2 Würfel mit jeweils 6 Augen würfelt

    Wenn er die relativen Haeufigkeiten zaehlt, dann legt er wohl Wert darauf. Die unterscheiden sich erheblich.


  • Administrator

    FreakY<3Cpp schrieb:

    Dravere schrieb:

    Wieso lesen die Leute nicht, was man ihnen als Hilfe gibt? 😕

    Wenn sie lesen würden, hätten wir hier wohl um einiges weniger Threads.

    Definitiv, aber dass ist doch meistens eher so, dass ihnen nicht bewusst ist, wo man dies eigentlich bekommt. Passiert mir zum Teil auch mal, dass ich das offensichtlichste nicht sehe, damit habe ich auch kein Problem. Wenn man es ihnen dann aber explizit unter die Nase reibt und sie es nicht lesen, dann verstehe ich echt nur noch Bahnhof. Für mich ist das dann fast etwas wie: "Kein Interesse das zu lesen, mach es für mich!" 🙄

    Grüssli



  • Hab mir nun eure Tipps zu Herzen genommen 😃 Es funktioniert einwandfrei , sieht guts aus und beim Anschauen des Codes bekommt man keine Augenschmerzen 😛

    Danke euch Allen für die Kritik 😋 !

    #include<iostream>
    #include<cstdlib>
    #include<time.h>
    #include<iomanip>
    using namespace std;
    
    int main()
    {
    
       long i;
       int random,summe[10],plus,check,ergebnis;
       float prozent[10];
       double input;
       time_t seconds;
    
       cout<<"Wilkommen zum WuerfelBot ! by Schwabe :P"<<endl;
       cout<<"Geben sie die gewuenschte Zahl an Wuerfel Wuerfen an! Und der"<<endl;
       cout<<"Bot wird jeweils mit 2 Wuerfel wuerfeln und die Augenzahlen addieren!"<<endl;
       cout<<"Das Ergebnis wird in einer Tabelle ausgegeben !"<<endl;
       cout<<"Geben sie die gewuenschte Zahl an Wuerfen an !"<<endl<<endl;
       cin>>input;
       cout<<endl;
    
       i=0;
       plus=0;
    
       for(i=0;i<13;i++)
       {
           summe[i]=0;
       }
    
       i=0;
    
       while(i<input)
       {
           seconds = time(NULL);
           plus+= seconds;
           plus++;
    
           srand(plus);
           ergebnis = (rand()%6+1)+(rand()%6+1);
           i++;
           summe[ergebnis-2]++;
       }
    
       i=0;
    
       while(i<11)
       {
           prozent[i] = summe[i]/input;
           prozent[i]*=100;
    
           JumpGate:
    
           if(prozent[i]<0)
           {
               prozent[i]*=10;
               goto JumpGate;
           }
    
           i++;
    
       }
    
       i=2;
       check=0;
       cout<<"Summe"<<" | "<<"Anzahl"<<" | Prozent"<<endl;
       cout<<"________________________"<<endl;
    
       while(i<13)
       {
    
            if(i>=10)
            {
              cout<<i<<setw(9)<<summe[check]<<setw(9)<<prozent[check]<<"%"<<endl;
            }
    
            else
            {
              cout<<i<<setw(10)<<summe[check]<<setw(9)<<prozent[check]<<"%"<<endl;
            }  
    
            i++;
            check++;
    
       }
    
       system("pause");
    }
    

    PS: Ich weiss GoTo ist verhasst ^^ aber solange es übersichtlich bleibt :p



  • versuch das goto durch eine schleife zu ersetzen. das ist trivial und eine gute übung.



  • °Stealth° schrieb:

    und beim Anschauen des Codes bekommt man keine Augenschmerzen

    Kommt wohl auf die Augen an. 😃

    Was ich noch anders machen würde:

    • Der Header heisst <ctime> , nicht <time.h> . Du kannst dir merken, dass Headerdateien aus der C++-Standardbibliothek niemals eine Dateiendung besitzen. Diejenigen, welche von C übernommen wurden, haben ein vorgestelltes "c" (z.B. <string.h> wird <cstring> ).
    • Keine Mehrfachdeklarationen, vor allem nicht mit unterschiedlichen Typen!
    • Deklaration der Variablen dort, wo man sie braucht. Es bringt nichts, alles am Anfang der Funktion zu deklarieren.
    • Nimm For-Schleifen. Dann musst du nicht zwischendrin Variablen auf 0 setzen, kannst die Inkrementierung gleich in den Schleifenkopf packen, und hast die ganze Schleifenlogik kompakt an einer Stelle.
    • goto ist nicht verhasst, sondern in sehr vielen Fällen einfach unnötig. Bei dir würde es eine While-Schleife genauso gut tun...


  • Alles klar ^^ Dann weiss ich was ich nächstes mal besser machen kann bzw. wohl eher muss 😃



  • for(int i=0;i<13;i++)
    {
       summe[i] = 0;
    }
    
    int plus = 0;
    for(int i = 0; i < input; i++)
    {
       seconds = time(NULL);
       plus += seconds; // warum nicht gleich plus += seconds + 1
       plus++;
    
       srand(plus);
       ergebnis = (rand()%6+1)+(rand()%6+1);
       summe[ergebnis-2]++;
    }
    
    for(int i = 0; i < 11; i++)
    {
       prozent[i] = summe[i]/input;
       prozent[i]*=100;
    
       while(prozent[i] < 0)
       {
           prozent[i]*=10;
       }  
    }
    


  • oh. jetzt erst gesehen:

    srand() rufst du viel zu oft auf. Lies den Artikel nochmal der verlinkt wurde: srand nur einmal aufrufen. Öfters bringts nicht (auch wenn du künstlich den seed immer änderst).

    summe hat nur 10 elemente und du gehst in der einen forschleife aber bis 13. schlecht. auch das 0 setzen geht mit memset() deutlich einfacher.

    dort wo du das goto verwendest, was macht das eigentlich? wie kann bei summe[i]/input etwas negatives raus kommen? und ist es nicht so dass wenn du etwas negatives mit 10 multiplizierst es nie wirklich positiv wird? 😉

    versuche magic numbers zu vermeiden. du verwendest in schleifen manchmal 13, manchmal 11, das ist komisch. mal abgesehen davon dass dir dabei ein paar fehler passiert sind, ist es meistens besser einen namen statt einer zahl dort stehen zu haben.

    und als übung kannst du versuchen die einzelnen abschnitte des programms in funktionen zu packen 🙂


Anmelden zum Antworten