Probleme mit srand()...



  • In einer For-Schleife möchte ich ein integer Array (sagen wir mal 50 Elemente) mit Zufallszahlen belegen.
    Also praktisch:

    [code]
    for (count=0; count < MAX; count++)
    array[count] = rand();

    Die Zufallszahlen bleiben jedoch immer gleich, wenn ich das Programm z.B. neu starte.

    Ich hab die FAQ angeschaut und einige Treads durchgelesen. Dort wird empfohlen, srand zu verwenden.
    Wenn ich srand(time(NULL)); davor einfüge bekomme ich zwar bei jedem Programmstart andere Zahlen, doch diese Zahlen sind alle gleich.

    Ich vermute mal, das kommt daher, weil sich die Systemzeit während der Ausführung der Schleife nicht ändert.
    Gibt es eine Lösung das zu umgehen?



  • Das Problem kommt vor allem daher, daß du srand() an der falschen Stelle eingesetzt hast - du brauchst es nur EIN MAL am Anfang des Programms, um den Zufallsgenerator zu initialisieren, danach erzeugt dir rand() eine pseudozufällige Zahlenfolge (die je nach akuteller Uhrzeit woanders beginnt).

    srand(time(NULL));
    for(count=0; count < MAX; count++) 
      array[count] = rand();
    

    PS: Such mal nach dem User TactX, der hat einen interessanten Artikel zum Thema Zufall in seine Signatur gestellt.



  • CStoll schrieb:

    PS: Such mal nach dem User TactX, der hat einen interessanten Artikel zum Thema Zufall in seine Signatur gestellt.

    Ich erspar mal die Suche 😉

    Zudem werde ich den Artikel mal im FAQ-Eintrag verlinken. Dann muss man nicht immer meine Signatur referenzieren.



  • Sehr guter und ausführlicher Artikel!
    Habe dadurch viel über rand() gelernt.

    Irgendwo am Anfang hast Du "die" statt "dice" geschrieben (falls Du das korrigieren willst).

    Wenn ich alles, was mit der Zufallszahl zu tun hat in eine Funktion packen will kann ich dann folgendes machen (wenn ich srand auch in der Funktion haben will), oder gibt es da eine bessere Lösung:

    static int chk_srand = 0;
    
    if ( chk_srand == 0 )
    {
    	srand( time(NULL) );
    	chk_srand++;
    }
    


  • Simonek schrieb:

    Irgendwo am Anfang hast Du "die" statt "dice" geschrieben (falls Du das korrigieren willst).

    a) "die" ist auch korrekt
    b) ich heisse nicht Julienne Walker 🤡

    Simonek schrieb:

    Wenn ich alles, was mit der Zufallszahl zu tun hat in eine Funktion packen will kann ich dann folgendes machen (wenn ich srand auch in der Funktion haben will), oder gibt es da eine bessere Lösung:

    static int chk_srand = 0;
    
    if ( chk_srand == 0 )
    {
    	srand( time(NULL) );
    	chk_srand++;
    }
    

    Die Lösung funktioniert. Die bessere Lösung wäre srand() eben nicht in der Funktion aufzurufen 😉



  • Ok, eine Frage habe ich noch:

    Ich möchte in der Funktion den Wertebereich erweitern (von int auf long).
    Daher ermittel ich zuerst, wieoft RAND_MAX im Wertebereich enthalten ist.

    Eine For-Schleife addiert solange zahl += rand(), sooft RAND_MAX im Wertebereich enthalten ist.

    Außerdem wird der Rest ermittelt, dafür eine Zufallszahl mit einem entsprechenem max. Limit erzeugt und am Schluss dazu addiert.

    Bei niedrigen Werten (bis ca. 100.000) funktioniert das auch ganz gut, doch bei Werten > 1 Million sind die Zahlen alle bei etwa 500.000, weil je öfter die Schleife ausgeführt wird die Wahrscheinlichkeit für die Durchschnittszahl des Wertebereichs zunimmt.

    Für einen Lösungsansatz wäre ich daher sehr dankbar, um effektive Zufallszahlen bei einem Wertebereich von z.B. 1 Million zu erhalten.



  • Bitshift



  • Geht das ein wenig genauer?

    Ich weiß was Bitshift ist und wie man es einsetzt. Nur in diesem Zusammenhang kann ich mir kein Bild davon machen, wie man sie zusammen mit rand() verwendet.



  • Du ermittelst zwei Zufallszahlen und setzt sie dann per Bit-Operationen zu einer größeren zusammen:

    const int stellen = ...;//Binäre Länge von RAND_MAX
    int r1=rand(),r2=rand();
    long zufall = r1<<stellen | r2;
    
    //oder
    
    long zufall = r1*RAND_MAX+r2;
    

Anmelden zum Antworten