problem mit random



  • also mein problem ist, dass ich in einer schleife 4 Zufallszahlen generieren muss:

    for(;;){
    srand((unsigned)time(NULL));a=1+rand()%254;
    srand((unsigned)time(NULL));b=1+rand()%254;
    srand((unsigned)time(NULL));c=1+rand()%254;
    srand((unsigned)time(NULL));d=1+rand()%254;
    }

    da time() nur eine genauikeit von 1 sekunde hat bekomme ich a=b=c=d.
    dazu kommt noch, dass sich a, b, c, d nur jede sekunde ändern obwohl ich es ja jeden schleifendurchgang bräuchte.

    wie kann ich das ändern??
    cu



  • srand((unsigned)time(NULL));a=1+rand()%254;
    srand((unsigned)2time(NULL));b=1+rand()%254;
    srand((unsigned)3
    time(NULL));c=1+rand()%254;
    srand((unsigned)4*time(NULL));d=1+rand()%254;

    so wären die werte unterschiedlich aber sie ändern sich trotzdem erst jede sekunde.

    wie bekommt ich jetzt hin, dass sie sich jeden schleifendurchgang ändern. also wirklich jedesmal, auch nicht jede milisekunde oder so. das ist auch noch zu ungenau.



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int i;
        srand(time(NULL));
    
        for (i = 0; i < 10; ++i) {
            int a, b, c, d;
    
            a = rand() % 254;
            b = rand() % 254;
            c = rand() % 254;
            d = rand() % 254;
    
            printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d);
        }
    
        return 0;
    }
    


  • danke!
    funzt - es verwirrt mich einwenig.

    cu



  • Noe, das ist nicht verwirrend. Wie Du voellig richtig erkannt hast, aendert sich time() nur im Sekundentakt. Die Aufrufe von srand() erfolgen bei Dir aber in einem sehr kurzen Zeitabstand, so dass die Wahrscheinlichkeit jedesmal mit derselben seed zu initialisieren sehr hoch ist. Die Folge davon sind identische Werte von rand()! I.A. reicht es, srand() ein einziges mal beim Programmstart aufzurufen (damit man nicht bei jedem Programmdurchlauf die gleichen Werte bekommt). Danach brauchste im Normalfall keinen weiteren Aufruf von srand() mehr. Wenn Du das aber aus irgendwelchen Gruenden doch tun willst, dann tu's an irgendwelchen Programmstellen, die in laengeren und eher zufaelligen Zeitabstaenden erreicht werden (z.B. bei der ersten Benutzerinteraktion eines neuen Tages - sofern Dein Proggi ueberhaupt ne Uptime von mehr als nem Tag hat). Das reicht voellig!


Anmelden zum Antworten