"Befehl" : rand / srand



  • Moin zusammen !

    Ich habe ein Problem mit den Zufalls "Befehlen" ! Wenn ich diese verwende um z.B einen Würfel zu simulieren kommt bei mir jedes mal das gleiche Ergebnis heraus! Auch wenn ich die Anwendung ( also das kleine Zufalls Programm ) neu starte kommt jedes mal das gleiche heraus ! Hier mal ein kleiner Bsp. Source Code :

    #include<stdlib.h>
    #include<iostream>
    using namespace std;
    
    int main()
    {
    
        srand(1);
        int test = rand () % 6+1;
        cout<<test<<endl;
        system("pause");
    
    }
    

    Auch wenn ich das #include<stdlib.h> weglasse kommt jedesmal das gleiche heraus ! Ist mir einfach unerklärlich 😮

    Noch ein paar Infos ( falls es etw. beeinflusst ) !

    Betriebssystem : Windows 7
    Compiler/Editor : Bloodsheed`s Dev C++ ( Compiler + Editor in einem ! )

    PS: Mir ist bewusst dass es nicht "Befehl" heisst 🤡

    Danke im v orraus !




  • Administrator

    Dir wurde ja geholfen, was das Problem betrifft. Nun wollen wir dir noch anderswo helfen:

    °Stealth° schrieb:

    Compiler/Editor : Bloodsheed`s Dev C++ ( Compiler + Editor in einem ! )

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-237002.html

    😉

    Grüssli



  • °Stealth° schrieb:

    Auch wenn ich das #include<stdlib.h> weglasse kommt jedesmal das gleiche heraus ! Ist mir einfach unerklärlich 😮

    Kein Wunder, du setzt den Seed bei Programmstart jedes Mal auf den gleichen Wert 1. Um bei jedem Durchlauf unterschiedliche Werte zu erhalten, könntest du z.B. die aktuelle Zeit nehmen (mit time )

    °Stealth° schrieb:

    PS: Mir ist bewusst dass es nicht "Befehl" heisst 🤡

    Warum verwendest du dann nicht gleich das richtige Wort (nämlich Funktion)?



  • Danke euch vielmals für die Aufklärung über diese Funktion ! 😃



  • So bin nochmal ich !
    Ich hatte vor ein Programm zu schreiben das beliebig oft mit 2 Wuerfel wuerfelt und daie herausgekommenen Augenzahlen addiert ! Die Ergebnisse( wie oft sich welche Summe ergeben hat ) sollen in einer Tablelle ausgegeben werden!

    Leider funzt es nicht richtig ... Zahlen sind wieder nicht zufällig und die Ergebnisse ( also welche Summe wie oft ) werden nicht richtig gezählt ! HIIILFE !

    #include<cstdlib>
    #include<iostream>
    #include<time.h>
    #include<iomanip>
    using namespace std;
    
    int main()
    {
        time_t seconds2;
        system("pause");
        cout<<endl;
       int i=0,input,wuerfel1,wuerfel2,ergebnis;
       int summe[11];
    
      float prozent;
      int outProzent;
       time_t seconds1;
       cout<<"Wilkommen zum Wuerfel Bot by Schwabe !\n"<<endl;
       cout<<"Anleitung\n Geben sie eine gewuenschte Anzahl an Wuerfel Wuerfen an ! Der Bot wird nun jemals mit 2 Wuerfel wuerfel und die Augenzahlen addieren ! Die Ergebnisse werden ihnen in einer Tabelle ausgegeben!"<<endl;
       cout<<"Geben sie eine gewuenschte Zahl an Wuerfen an !"<<endl<<endl<<endl<<endl;
       cin>>input;
    
       for(i=0;i<input;i++)
    {
                            seconds1 = time(NULL);
                            seconds2 = time(NULL);
                           srand(seconds1);
                           wuerfel1 = rand()%6+1;
    
                           srand(seconds2);
                           wuerfel2 = rand()%6+1;
    
                           ergebnis = wuerfel1+wuerfel2;
    
                           switch(ergebnis)
                           {
                                           case 2:
                                                summe[0]++;
                                           break;
    
                                           case 3:
                                                summe[1]++;
                                           break;
    
                                           case 4:
                                                summe[2]++;
                                           break;
    
                                           case 5:
                                                summe[3]++;
                                           break;
    
                                           case 6:
                                                summe[4]++;
                                           break;
    
                                           case 7:
                                                summe[5]++;
                                           break;
    
                                           case 8:
                                                summe[6]++;
                                           break;
    
                                           case 9:
                                                summe[7]++;
                                           break;
    
                                           case 10:
                                                summe[8]++;
                                           break;
    
                                           case 11:
                                                summe[9]++;
                                           break;
    
                                           default:
                                                   summe[10]++;
                                           break;
                           }
    }
    
    cout<<"__________________________________________________________"<<endl;
    cout<<"Summen"<<setw(8)<<"Wuerfe"<<setw(8)<<"Prozent"<<endl;
    int a,b,c;
    for(c=2;c<13;c++)
    {
                     cout<<c<<setw(1)<<"|"<<setw(8);
                     for(a=0;a<11;a++)
                     {
                                      cout<<summe[a]<<" |";
                                      break;
                     }
                     /*for(b=0;b<11;b++)
                     {
                                      bool test=true;
                                      prozent = summe[a]/input;
                                      outProzent = prozent*10;
    
                                      while(test)
                                      {
                                                         outProzent*10;
                                                         if(outProzent>0)
                                                         {
                                                                          test=false;
                                                         }
                                      }
                                      cout<<outProzent<<"%";
                     }*/
    cout<<endl;
    
    } 
    
    system("pause");  
    }
    


  • srand sollte nur einmal bei Programmstart aufgerufen werden.



  • Mensch Bub, was machst du denn da. Erstmal habe ich mich eben gefragt ob Augen kotzen können, bei so einer Einrückung...
    Grausam wie du versuchst zum Ergebnis zukommen, bitte schau nochmal in ein Tutorial rein.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        srand(unsigned(time(NULL)));
    
        int input;
        cout << "Wilkommen zum Wuerfel Bot by Schwabe !\n" << endl;
        cout << "Anleitung\nGeben sie eine gewuenschte Anzahl an Wuerfel Wuerfen an !" << endl;
        cout << "Der Bot wird nun jemals mit 2 Wuerfel wuerfel und die Augenzahlen addieren !" << endl;
        cout << "Die Ergebnisse werden ihnen in einer Tabelle ausgegeben!" << endl;
        cout << "Geben sie eine gewuenschte Zahl an Wuerfen an !" << endl << endl << endl << endl;
        cin >> input;
    
        int wurf_summe = 0;
        int gesamt_summe = 0;
    
        for(int i = 1; i <= input; i++)
        {
            wurf_summe = (rand()%6) + (rand()%6); //oder gleich rand()%12
            gesamt_summe += wurf_summe;
    
            cout << i << ".Wurf = " << wurf_summe << endl;
        }
        cout << "Gesamtsumme: " << gesamt_summe;
    }
    

    Übrigens musste ich mir eben das Lachen verkneifen, als ich deine ellenlange cout Zeile gesehen habe und ich beim Scrollen überlegt habe, ob ich nochmal den Kaffee ansetze 😃



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

    P.S: Und den langen switch-case kann du auch einfach eliminieren:

    summe[ergebnis-2]++;
    


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

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



  • 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;
       }  
    }
    

Anmelden zum Antworten