Wie funktioniert rand()?



  • Hallo,

    http://www.proggen.org/doku.php?id=c:lib:stdlib:rand

    Hier steht, "rand()" liefert als return value eine Pseudozufallszahl.
    Meine Frage ist, woher die Funktion Entropie bekommt.

    Viele Programme, die mit Pseudozufallszahlen arbeiten, betreiben im Hintergrund entropy polling.
    Ich kann mir aber irgendwie nicht vorstellen, dass das hier auch der Fall ist.



  • Die Entropie kommt initial vom Aufruf der Funktion srand(). Und danach werden eben Pseudozufallszahlen generiert, da kommt keine weitere Entropie rein.



  • Nachdem rand ein linearer Kongruenzgenerator ist lässt sich der Sourcecode recht simpel zum Verständnis zeigen:

    #include <stdio.h>
    
    /* always assuming int is at least 32 bits */
    int rand();
    int rseed = 0;
    
    inline void srand(int x)
    {
    	rseed = x;
    }
    
    #ifndef MS_RAND
    #define RAND_MAX ((1U << 31) - 1)
    
    inline int rand()
    {
    	return rseed = (rseed * 1103515245 + 12345) & RAND_MAX;
    }
    
    #else /* MS rand */
    
    #define RAND_MAX_32 ((1U << 31) - 1)
    #define RAND_MAX ((1U << 15) - 1)
    
    inline int rand()
    {
    	return (rseed = (rseed * 214013 + 2531011) & RAND_MAX_32) >> 16;
    }
    
    #endif/* MS_RAND */
    
    int main()
    {
    	int i;
    	printf("rand max is %d\n", RAND_MAX);
    
    	for (i = 0; i < 100; i++)
    		printf("%d\n", rand());
    
    	return 0;
    }
    


  • rand() ist ein Pseudo-Zufallszahlengenerator und deshalb gibt es dort gar keine Entropie. Für jeden Seed ist die Zahlen-Abfolge fest definiert.


Anmelden zum Antworten