Zufallszahlen



  • Hallo zusammen,

    ich hätte da mal eine Anfängerfrage an die Profis 😉
    Und zwar brauch ich ein Array, dass 16 Zufallszahlen
    zwischen 1 und 4 enthält und höchstens 4x die Gleiche.
    Folgender Code liefert mir bei einzelnen Zahlen immer eine
    andere aber verwende ich ihn in einer FOR-Schleife bekomme
    ich immer 16 gleiche Zahlen...
    Warum ist das so?
    Danke für Eure Hilfe

    #include <time.h> // time( )
    #include <stdlib.h> // srand( ), rand( )
    #include <stdio.h> // printf( )
    
    int los(  )
    {
        int zahl;
    
        srand( (unsigned) time( 0 ) ); 
    
        zahl = ( rand( ) % 4 ) + 1;
    
        return zahl;
    
    }
    
    int main (void)
    {
        int grp_count[3];
        int i,index;
        index=0;
    
        //grp_count[0],grp_count[1],grp_count[2],grp_count[3] = 0;
    
        int zahl[15];
    
        for(i=0;i<16;i++)
        {
        zahl[index] = los();
    
        printf("%i\n",zahl[index]);
    
        index=index+1;
    
        }
    
       // printf("%i\n%i\n%i\n%i\n",grp_count[0],grp_count[1],grp_count[2],grp_count[3]);
    
        return 0;
    }
    


  • Du solltest srand() immer nur bei Programmstart aufrufen, nicht bei jedem Schleifendurchlauf.



  • Ja ok das ist eine Stilsache aber es liefert mir keine Antwort auf meine Frage...
    Ich vermute ja das der Schleifendurchlauf zu schnell geht. Aber ich kenne bzw finde leider keine Funktion, die das Programm für x Millisek. warten lässt.



  • Nein, das ist keine Stilsache, das ist dein Fehler!



  • Tatsache es funktioniert jetzt. Vielen Dank. Könntest Du mir noch einen Tip
    geben warum sich das ganze so verhällt?
    Ein anderes "seltsames" Verhalten ist mir grad noch aufgefallen und zwar wenn ich den Code so lasse wie ich ihn geposted habe und sleep(1) mit einbaue, bekomme ich immer 4x die gleiche Zahlenfolge.
    Ich wäre für jede Aufklärung sehr dankbar.



  • rand() merkt sich sein letztes Ergebnis und nimmt dieses als nächsten Startwert.

    Beim ersten Aufruf von rand() ist der Wert immer gleich, daher wird immer die selbe Zahlenfolge erzeugt.

    Mit srand() kann man den Startwert setzen. Wenn man aber immer wieder den selben Startwert nimmt, kommt danach auch immer die selbe Zahlenfolge raus.

    Wenn man jetzt srand() mit dem Ergebnis von time() (Anzahl der Sekunden seit irgenwann (1.1.1970)) aufruft, sollte jede Sekunde eine andere Zahlenfolge entstehen.

    Dein Rechner ist halt so schnell, das srand() immer mit dem selben Ergebnis von time() aufgerufen wurde.

    Also srand() am besten in main() nach dem Programmstart aufrufen.
    Man kann auch die Zeit nehmen bis ein Benutzer eine Eingabe macht, oder ...
    Hauptsache unterschiedliche Werte.



  • Danke für Deine Erklärung.
    Gruß


Anmelden zum Antworten