DOKK / manpages / debian 11 / manpages-de-dev / srandom.3.de
RANDOM(3) Linux-Programmierhandbuch RANDOM(3)

random, srandom, initstate, setstate - Zufallszahlengenerator

ÜBERSICHT

#include <stdlib.h>
long random(void);
void srandom(unsigned seed);
char *initstate(unsigned seed, char *state, size_t n);
char *setstate(char *state);

Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

random(), srandom(), initstate(), setstate():

_XOPEN_SOURCE >= 500
|| /* Glibc seit 2.19: */ _DEFAULT_SOURCE
|| /* Glibc-Versionen <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

Die Funktion random() benutzt einen Zufallsgenerator mit nichtlineareradditiver Rückkopplung (Feedback) mit einer vorgegebenen Tabellengröße von 31 »long integers«, um aufeinander folgende Pseudozufallszahlen im Bereich von 0 bis 2^31 - 1 zurückzugeben. Die Periode dieses Zufallszahlengenerators ist sehr groß, ungefähr 16 * ((2^31) - 1).

Die Funktion srandom() setzt ihr Argument zur Initialisierung (als »Saat«) für eine neue Folge von pseudozufälligen Ganzzahlen, welche von random() geliefert werden. Diese Folgen sind wiederholbar durch Aufruf von srandom() mit der gleichen Saat. Falls keine Saat angegeben wird, wird random() automatisch mit dem Wert 1 gestartet.

Die Funktion initstate() erlaubt es, ein Zustandsfeld state für den Gebrauch durch random() zu initialisieren. Die Größe n des Zustandsfeldes wird von initstate() benutzt, um zu entscheiden wie differenziert es einen Zufallszahlengenerator benutzen soll – je größer das Zustandsfeld, desto besser die Zufallszahlen. Derzeit sind »optimale« Werte für die Größe des Zustandsfelds n 8, 32, 64, 128 und 256 Byte; andere Größen werden zu dem nächsten bekannten Wert abgerundet. Die Verwendung von weniger als 8 Byte führt zu einem Fehler. seed ist der Wert für die Initialisierung, welcher den Startpunkt für den Zufallszahlenfolge angibt und ermöglicht, am gleichen Punkt erneut zu starten.

Die Funktion setstate() ändert das Zustandsfeld, welches von der Funktion random() benutzt wird. Das Zustandsfeld state wird bis zum nächsten Aufruf von initstate() oder setstate() zum Erzeugen der Zufallszahlen benutzt . state muss dafür initialisiert worden sein: durch den Aufruf von initstate() oder setstate().

Die Funktion random() liefert einen Wert zwischen 0 und (2^31) - 1 zurück. Die Funktion srandom() liefert keinen Wert zurück.

Die Funktion initstate() gibt einen Zeiger auf das vorige Zustandsfeld zurück. Bei einem Fehler wird errno entsprechend gesetzt.

Bei Erfolg gibt initstate() einen Zeiger auf das vorige Zustandsfeld zurück. Bei einem Fehler wird NULL zurückgegeben und errno entsprechend gesetzt.

Das an setstate() übergebene state-Argument war NULL.
Ein Zustandsfeld von weniger als 8 Byte wurde an initstate() übergeben.

Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.

Schnittstelle Attribut Wert
random(), srandom(), initstate(), setstate() Multithread-Fähigkeit MT-Safe

POSIX.1-2001, POSIX.1-2008, 4.3BSD.

Die Funktion random() sollte nicht in Programmen mit mehreren Threads, bei denen reproduzierbares Verhalten benötigt wird, verwandt werden. Nutzen Sie für diesen Anwendungsfall stattdessen random_r(3).

Die Erzeugung von Zufallszahlen ist eine schwierige Aufgabe. Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 2007, 3rd ed.) enthält in Kapitel 7 (Random Numbers) eine ausgezeichnete Diskussion der Probleme bei der praktischen Erzeugung von Zufallszahlen.

Eine eher theoretische Diskussion, die auch viele praktische Probleme aufgreift, finden Sie in Kapitel 3 (Random Numbers) in Donald E. Knuths The Art of Computer Programming, Volume 2 (Seminumerical Algorithms), 2nd ed.; Reading, Massachusetts: Addison-Wesley Publishing Company, 1981.

Laut POSIX sollte initstate() im Fehlerfall NULL zurückliefern. In der Glibc-Implementierung wird (wie spezifiziert) errno im Fehlerfall gesetzt, aber die Funktion liefert nicht NULL zurück.

getrandom(2), drand48(3), rand(3), random_r(3), srand(3)

Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <krd@gulu.net>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Dr. Tobias Quathamer <toddy@debian.org> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.

1. November 2020 GNU