rand(3) Library Functions Manual rand(3) BEZEICHNUNG rand, rand_r, srand - Pseudo-Zufallszahlengenerator BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int rand(void); void srand(unsigned int seed); [[veraltet]] int rand_r(unsigned int *seedp); Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)): rand_r(): Seit Glibc 2.24: _POSIX_C_SOURCE >= 199506L Glibc 2.23 und alter _POSIX_C_SOURCE BESCHREIBUNG Die Funktion rand() gibt eine pseudo-zufallige Ganzzahl im Bereich 0 bis RAND_MAX inklusive zuruck (d.h. dem mathematischen Bereich [0, RAND_MAX]). Die Funktion srand() setzt ihr Argument als Seed (Zufallswert zum Erzeugen kryptografischer Schlussel) fur eine neue Reihe von pseudo-zufalligen Ganzzahlen ein, die von rand() zuruckgegeben werden. Diese Sequenzen sind durch Aufruf von srand() mit dem selben Zufallsstartwert wiederholbar. Wenn kein Zufallsstartwert angegeben wird, wird automatisch 1 als Zufallsstartwert fur rand() genommen. Die Funktion rand() ist nicht ablaufinvariant, da sie versteckten Status benutzt, der bei jedem Aufruf geandert wird. Dies ist moglicherweise nur der Zufallsstartwert, der beim nachsten Aufruf verwendet werden soll, oder etwas komplizierteres. Um ein reproduzierbares Verhalten fur eine Anwendung mit Threads zu erhalten, muss dieser Status explizit gesetzt werden; dies kann mit der ablaufinvarianten Funktion rand_r() erledigt werden. Wie rand() gibt rand_r() eine pseudo-zufallige Ganzzahl im Bereich [0, RAND_MAX] zuruck. Das Argument seedp ist ein Zeiger auf einen unsigned int, der benutzt wird, um den Status zwischen Aufrufen zu speichern. Falls rand_r() mit dem gleichen Anfangswert fur die Ganzzahl aufgerufen wird, auf die seedp zeigt, und der Wert zwischen den Aufrufen nicht verandert wurde, dann wird das Ergebnis die gleiche pseudo-zufallige Sequenz sein. Der Wert, auf den das Argument seedp von rand_r() zeigt, stellt nur einen kleinen Anteil des Status bereit, daher wird diese Funktion nur ein schwacher Pseudo-Zufallsgenerator sein. Probieren Sie stattdessen drand48_r(3). RUCKGABEWERT Die Funktionen rand() und rand_r() geben einen Wert zwischen 0 und RAND_MAX (inklusive) zuruck. Die Funktion srand() gibt keinen Wert zuruck. ATTRIBUTE Siehe attributes(7) fur eine Erlauterung der in diesem Abschnitt verwandten Ausdrucke. +--------------------------------+-------------------------+-----------+ |Schnittstelle | Attribut | Wert | +--------------------------------+-------------------------+-----------+ |rand(), rand_r(), srand() | Multithread-Fahigkeit | MT-Sicher | +--------------------------------+-------------------------+-----------+ VERSIONEN Die Versionen von rand() und srand() in der Linux C-Bibliothek benutzen den selben Zufallszahlengenerator wie random(3) und srandom(3), daher sollten niederwertige Bits genauso zufallig wie hoherwertige Bits sein. Bei alteren Implementierungen von rand() sind niederwertige Bits jedoch viel weniger zufallig als hoherwertige Bits. Benutzen Sie diese Funktion nicht in Anwendungen, die portierbar sein sollen, wenn ein hochwertiger Zufall benotigt wird. (Benutzen Sie stattdessen random(3).) STANDARDS rand() srand() C11, POSIX.1-2008. rand_r() POSIX.1-2008. GESCHICHTE rand() srand() SVr4, 4.3BSD, C89, POSIX.1-2001. rand_r() POSIX.1-2001. In POSIX.1-2008 als veraltet markiert. BEISPIELE POSIX.1-2001 gibt das folgende Beispiel einer Implementierung von rand() und srand(), das vielleicht nutzlich ist, wenn es darum geht, die gleiche Abfolge auf zwei unterschiedlichen Rechnern zu erhalten. static unsigned long next = 1; /* es wird angenommen, dass RAND_MAX 32767 ist */ int myrand(void) { next = next * 1103515245 + 12345; return((unsigned)(next/65536) % 32768); } void mysrand(unsigned int seed) { next = seed; } Das folgende Programm kann benutzt werden, um eine pseudo-zufallige Sequenz anzuzeigen, die durch rand() erzeugt wird, wenn ein bestimmter Zufallsstartwert (Zufallswert zum Erzeugen kryptografischer Schlussel) vorgegeben wird. Wenn der Zufallsstartwert als -1 angegeben wird, verwendet das Programm einen zufalligen Zufallsstartwert. #include #include int main(int argc, char *argv[]) { int r; unsigned int seed, nloops; if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } seed = atoi(argv[1]); nloops = atoi(argv[2]); if (seed == -1) { seed = arc4random(); printf("seed: %u\n", seed); } srand(seed); for (unsigned int j = 0; j < nloops; j++) { r = rand(); printf("%d\n", r); } exit(EXIT_SUCCESS); } SIEHE AUCH drand48(3), random(3) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Patrick Rother , Chris Leick und Mario Blattermann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 rand(3)