srand funktioniert nicht



  • Versuche ein Program zu schreiben, das 100 Würfe einer Münze simulieren soll.
    danach soll das Program anzeifgen, wie viel ie eine und wieviel die andere Seite "geworfen" wurde

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using std::cout;
    using std::cin;
    using std::endl;
    using std::rand;
    using std::srand;
    
      bool flip(); //simuliert einen einzelnen Wurf der Münze
    
       int main() {
    
    	   int side2 = 0, side1 = 0;
    
    	   for (int i = 1; i <= 100; i++) {
    		   if (flip() == 1) side1++;
    		   if (flip() != 1) side2++;
    	   }
    
    	   cout << "Seite 1: ";
    	   cout << side1;
    	   cout << endl << "Seite 2: ";
    	   cout << side2;
    	   cin >> side1;
    
       }
    
       bool flip(){
    
    	   int a;
    
    	   srand(time(NULL));
    	   a = 1 + rand() % 2 ;
    	   if (a == 1) return 1;
    	   if (a == 0) return 0;
    
       }
    

    Da Programm sollte teoretisch ungefär 50 Würfe von jeder Seite machen, doch es zeigt an dass die erste Seite 100 mal , die andere 0 mal geworfen wird!!! 😡



  • srand nur EINMAL im programm aufrufen



  • if (a == 1) return 1; 
    if (a == 0) return 0;
    

    Man kanns auch kompliziert lösen...



  • besser wäre es so

    bool arr[2] = { false, true };
    
    bool flip(){
        //...
        if(a==0) return arr[0];
        if(a==1) return arr[1];
    }
    


  • a = 1 + rand() % 2 ; kann nie 0 werden...

    greetz KN4CK3R



  • Optimierte Version von flip:

    bool flip()
    {
        static bool bRandomize = true;
    
        if(bRandomize)
        {
            srand((unsigned)time(NULL));
            bRandomize = false;
        }
    
        return rand()%2;
    }
    

    MfG, Jochen



  • @Jochen S.
    srand() so in einer Funktion zu "verstecken", würde ich jetzt nicht für gut befinden. Dadurch wird die Funktion für Simulationen ungeeignet.



  • Mitleid schrieb:

    @Jochen S.
    srand() so in einer Funktion zu "verstecken", würde ich jetzt nicht für gut befinden. Dadurch wird die Funktion für Simulationen ungeeignet.

    \
    Ja, das fuehle ich auch irgendwie. Aber wie wuerde man es am besten machen+_)(#$$|"}{:+!@#$$%^&( finde das Frageyeichen nicht )



  • Wenn ich das richtig im Kopf habe, befindet sich das Fragezeichen auf einer amerikanischen Tastatur dort, wo die deutsche den Unterstrich (_) hat.

    Ansonsten...spricht etwas dagegen, srand einmal am Anfang der main aufzurufen?

    Falls rand() vor main gebraucht wird, ginge etwas in der Art:

    int seed_rng() {
      std::srand(std::time(0));
      return 1;
    }
    
    static int const rng_seeded = seed_rng();
    

    ...aber dann auf Initialisierungsreihenfolge achten! Im Extremfall

    struct rng {
      rng() { std::srand(std::time(0)); }
    
      int operator()() const { return std::rand(); }
    
      static rng const &instance() {
        static rng const me;
        return me;
      }
    };
    
    int get_random_number() { return rng::instance()(); }
    


  • Ja, so sehe ich das auch. Auf jeden Fall sollte dem Benutzer die Reproduzierbarkeit der Zahlenfolge als Möglichkeit erhalten bleiben. D.h. ich würde davon absehen in eigenen Funktionen den Zufallsgenerator mal einfach so neu zu initialisieren.


Anmelden zum Antworten