Problem mit Zufallsgenerator bei 2*Aufruf



  • Hiho, ich hab mal ne frage, hoffe mir kann da wer helfen.
    Also ich habe eine Funktion geschrieben um Zufallszahlen zwischen 0-10 zu
    generieren.

    Code:

    int Zufall()
    {
    int Wert;
    long Sek;

    time(&Sek);

    srand((unsigned)Sek);

    Wert = rand();

    while(Wert < 0 || Wert > 10)
    {
    Wert = rand();
    }

    return Wert;
    }

    Klappt ja alles ganz gut, das einzige Problem das ich habe ist, daß wenn ich
    die Funktion 2 mal hintereinander Aufrufe, 2 mal die selben Zahlen kommen.
    Wenn ich zwischen die beiden Aufrufe noch ein cin >> ... einfüge, dann gehts
    wieder, sieht so aus als ob er bei den Aufrufen hintereinander einfach den Wert
    aus dem Speicher nimmt oder so, ich weiss es nicht, kann mir da bitte wer
    helfen? 😕 Hab echt keine Ahnung woran es liegt. Vielleicht ist ja
    auch ein Fehler drin den ich nicht finde 😕



  • srand sollte man nur 1 mal aufrufen, denn srand initialisiert den zufallsgenerator!



  • kk, supi danke dir ich versuchs mal



  • Original erstellt von Waldbeere:
    Klappt ja alles ganz gut, das einzige Problem das ich habe ist, daß wenn ich
    die Funktion 2 mal hintereinander Aufrufe, 2 mal die selben Zahlen kommen.
    Wenn ich zwischen die beiden Aufrufe noch ein cin >> ... einfüge, dann gehts
    wieder, sieht so aus als ob er bei den Aufrufen hintereinander einfach den Wert
    aus dem Speicher nimmt oder so, ich weiss es nicht, kann mir da bitte wer
    helfen? 😕 Hab echt keine Ahnung woran es liegt. Vielleicht ist ja
    auch ein Fehler drin den ich nicht finde 😕

    Den eigentlichen Tipp hast du ja schon, nur ncoh zur verdeutlichung. Du initialisierst den Zufallsgenerator mit der Aktuellen Zeit in Sekunden. Wenn du nun zweimal direkt hintereinander das machst, ist noch dieselbe Zeit, also kommen dieselben Zahlen. Wenn du ein cin dazwischen machst, und du was eingibst, vergeht mit großer Wahrscheinlichkeit ein Zeitraum > 1 Sekunde und du bekommst andere Zahlen 🙂



  • Eine Zufallszahl zwischen 0 und 10 erhälst du durch

    rand()%11

    Und allgemein erhälst du eine Zufallszahl zwischen a und b (b>a) mit

    rand()%(b-a+1)+a

    Also nimm bitte diese katastrophale Schleife aus deinem Programm 😉

    [ Dieser Beitrag wurde am 31.05.2003 um 19:52 Uhr von space editiert. ]

    [ Dieser Beitrag wurde am 31.05.2003 um 19:55 Uhr von space editiert. ]



  • Huch danke für die restlichen Antworten, aber mit der Katastrophenschleife gehts
    auch 😉



  • der nachteil an dem gerator von space st das immer die gleichen "zufalls zahlen" kommen, allso der gleiche ablauf. Kennt einer einen Code wo IMMER etwas anders raus kommt, selbst wenn man das Progi neu startet? Hab schon mal versucht Zeit mit ein zu binden, hat aber net viel gepracht.

    [Edit]
    Achja um diesen 1sek Zeit problem aus dem Weg zu gehen kannst du sleep(1); benutzten, das findest du in der dos.h und friert das Programm für 1 sek ein, das beste ist das Programm hat zu der Zeit 0% CPU auslastung!
    [Edit]

    [ Dieser Beitrag wurde am 01.06.2003 um 01:13 Uhr von H@ckepeter editiert. ]



  • Hallo,

    ich würde die Initialisierung des Zufallsgenerators außerhalb der Funktion vornehmen, so wie Shade das ja schon gesagt hat. Damit hast du das "1s-Problem" beseitigt.



  • Original erstellt von Waldbeere:
    Huch danke für die restlichen Antworten, aber mit der Katastrophenschleife gehts
    auch 😉

    die schleife geht auch, ist aber ineffizient!
    also nimm die berechnung wie sie space vorgeschlagen hat.

    @H@ckepeter:
    nicht wenn srand nur einmal aufgerufen wurde.


Anmelden zum Antworten