Probleme mit Zufallszahlen



  • Hallo zusammen,

    ich habe ein Problem bei der Generierung von Zufallszahlen. Ich bekomme da immer die gleichen raus.

    hier mal mein code, wie ich die zahlen erzeuge:

    int VerTyp= 0;
        char typ;
        srand(( unsigned )time( NULL ));      // Startpunkt setzen
        VerTyp= rand() % 2;             // Zufallszahlen von 0 - 1 erzeugen
        if(VerTyp == 0)
    	typ= 'A';
        if(VerTyp == 1)
    	typ= 'B';
    

    Wenn ich das z.B. als Schleife laufen lasse, bekomme ich immer wieder die fünf gleichen Zahlen, bzw. hier würde ich dann ja rausbekommen, dass typ z.B immer gleich A ist.

    kann mir da jemand weiterhelfen, dass ich da verschiede Zahlen raus bekomme.

    Vielen Dank
    gruß
    Foxy



  • Rufe srand() nur einmal vor der Schleife aufrufen.

    Gruß



  • dann bekomme ich für den ersten z.B. A und für die weiteren 4 B bei 5 Schleifen durchläufen.



  • Und? Wenn Du abwechselnd A und B haben willst, dann implementier es so. Wenn Du was zufälliges haben willst, dann wunder Dich auch nicht, daß zufällig einmal A und dann 4mal B rauskommt.

    Oder passiert das bei jedem Programmdurchlauf? Dann solltest Du mal Deinen kompletten Code zeigen.



  • bei einem weiteren durchlauf hate ich 5mal b und bei einem dritten 5 mal a undbei einem 4. wieder 5 mal b:
    klar, kann es sein, dass es mal vorkommt, dass alles a oder b ist, aber das kommt ja immer vor.

    hier mal mein code:
    so wird die funktion random() aufgerufen:

    .....
    int Anzahl= 5;
    for(ii= 0; ii < Anzahl; ii++) 
    {
        typ= random(ii);
        .....
    }
    
    char random(int ii)
    {
        int VerTyp= 0;
        char typ;
        if(ii == 0)
            srand(( unsigned )time( NULL ));       
        VerTyp= rand() % 2;             
        if(VerTyp == 0)
    	typ= 'A';
        if(VerTyp == 1)
    	typ= 'B';
        std::ofstream file;
        file.open("typ.txt",std::ios_base::app);
        if ( !file )
        {
            TRACE( "Can't open file" ); /ausgegeben
        }
        file << "Typ: " << typ << '\n';
        return typ;
        file.close();
    
    }
    


  • Vielleicht so:

    typ = ((rand()/RAND_MAX) < 0.5)?'A':'B';
    


  • da kommt bei drei durchläufen immer A heraus



  • Dann nimm halt Boost.Random, das hat auch einen Zufallsgenerator für zwei Werte. Wenn du halbwegs "echte" Zufallszahlen haben willst ist der lineare Kongruenzkrams aus der cstdlib eh nicht zu gebrauchen.



  • .filmor schrieb:

    Vielleicht so:

    typ = ((rand()/RAND_MAX) < 0.5)?'A':'B';
    

    Das kann nichts werden wegen Ganzzahl-Arithmetik - d.h. du müsstest entweder rand() oder RAND_MAX nach double casten.


Anmelden zum Antworten