table of contents
other sections
RAND(3) | Linux-Programmierhandbuch | RAND(3) |
BEZEICHNUNG¶
rand, rand_r, srand - Pseudo-ZufallszahlengeneratorÜBERSICHT¶
#include <stdlib.h>int rand(void);int rand_r(unsigned int *seedp);void srand(unsigned int seed);
Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):
BESCHREIBUNG¶
Die Funktion rand() gibt eine pseudo-zufällige Ganzzahl im Bereich 0 bis RAND_MAX inklusive zurück (d.h. dem mathematischen Bereich [0, RAND_MAX]). Die Funktion srand() setzt ihr Argument als Seed (Zufallswert zum Erzeugen kryptografischer Schlüssel) für eine neue Reihe von pseudo-zufälligen Ganzzahlen ein, die von rand() zurückgegeben werden. Diese Sequenzen sind durch Aufruf von srand() mit dem selben Seed-Wert wiederholbar. Wenn kein Seed angegeben wird, wird automatisch 1 als Seed-Wert für rand() genommen. Die Funktion rand() ist weder ablaufinvariant noch sicher für Threads, da sie versteckten Status benutzt, der bei jedem Aufruf geändert wird. Dies ist möglicherweise nur der Seed-Wert, der beim nächsten Aufruf verwendet werden soll, oder etwas komplizierteres. Um ein reproduzierbares Verhalten für eine Anwendung mit Threads zu erhalten, muss dieser Status explizit gesetzt werden; dies kann mit der ablaufinvarianten Funktion rand_r() erledigt werden.RÜCKGABEWERT¶
Die Funktionen rand() und rand_r() geben einen Wert zwischen 0 und RAND_MAX (inklusive) zurück. Die Funktion srand() gibt keinen Wert zurück.KONFORM ZU¶
Die Funktionen rand() und srand() richten sich nach SVr4, 4.3BSD, C89, C99 und POSIX.1-2001. Die Funktion rand_r() richtet sich nach POSIX.1-2001. POSIX.1-2008 kennzeichnet rand_r() als veraltet.ANMERKUNGEN¶
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 zufällig wie höherwertige Bits sein. Bei älteren Implementierungen von rand() sind niederwertige Bits jedoch viel weniger zufällig als höherwertige Bits. Benutzen Sie diese Funktion nicht in Anwendungen, die portierbar sein sollen, wenn ein hochwertiger Zufall benötigt wird. (Benutzen Sie stattdessen random(3).)BEISPIEL¶
POSIX.1-2001 gibt das folgende Beispiel einer Implementierung von rand() und srand(), das vielleicht nützlich 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 seed) { next = seed; }
Das folgende Programm kann benutzt werden, um eine pseudo-zufällige Sequenz anzuzeigen, die durch rand() erzeugt wird, wenn eine bestimmte Seed (Zufallswert zum Erzeugen kryptografischer Schlüssel) vorgegeben wird.
#include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int j, r, nloops; unsigned int seed; if (argc != 3) { fprintf(stderr, "Aufruf: %s <seed> <nloops>\n", argv[0]); exit(EXIT_FAILURE); } seed = atoi(argv[1]); nloops = atoi(argv[2]); srand(seed); for (j = 0; j < nloops; j++) { r = rand(); printf("%d\n", r); } exit(EXIT_SUCCESS); }
SIEHE AUCH¶
drand48(3), random(3)KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux- man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler gemeldet werden können, finden sich unter http://www.kernel.org/doc/man-pages/.ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <krd@gulu.net> und Chris Leick <c.leick@vollbio.de> erstellt.1. Oktober 2010 |