random(3) (BSD Compatibility Package) random(3)
NAME
random, srandom, initstate, setstate - Funktionen für Pseudo-Zufalls-
zahlen
SYNTAX
#include <stdlib.h>
long random(void);
void srandom(unsigned int seed);
char *initstate(unsigned int seed, char *state, sizet size);
char *setstate(const char *state);
BESCHREIBUNG
Die Funktion random() verwendet einen nichtlinearen, additiven
Feedback-Zufallszahlengenerator und setzt ein Standard-Status-Array
mit der Größe von 31 langen Ganzzahlen (Long Integer) ein, um aufein-
anderfolgende Pseudo-Zufallszahlen im Bereich von 0 bis (2^31)-1 zu
generieren. Die Periode dieses Zufallszahlengenerators liegt etwa bei
16*((2^31)-1). Die Größe des Status-Arrays bestimmt die Periode des
Zufallszahlengenerators. Wird die Größe des Arrays heraufgesetzt, ver-
größert sich auch die Periode.
Mit 256 Bytes Statusinformationen ist die Periode des Zufallszahlenge-
nerators größer als 2^69.
Wie auch rand(), generiert random() standardmäßig eine Zahlenfolge,
die dupliziert werden kann, indem srandom() mit 1 als Startwert aufge-
rufen wird.
Die Funktion srandom() initialisiert das aktuelle Status-Array mit dem
Wert von seed.
Die Funktionen initstate() und setstate() dienen zum Neustarten und
Ändern von Zufallszahlengeneratoren. Mit der Funktion initstate() kann
ein Status-Array, auf das das Argument state zeigt, zur späteren Ver-
wendung initialisiert werden. Anhand des Arguments size, das die Größe
des Status-Arrays in Bytes angibt, bestimmt initstate(), welcher Typ
von Zufallszahlengeneratoren verwendet werden soll; je größer das
Status-Array, desto höher ist der Zufallsgrad der Zahlen. Werte für
die Anzahl der Statusinformationen sind 8, 32, 64, 128 und 256 Bytes.
Andere Werte über 8 Bytes werden jeweils auf den nächst niedrigeren
der genannten Werte gerundet. Bei Werten größer als oder gleich 8 oder
kleiner als 32 verwendet random() einen einfachen linearen kongruenten
Zufallszahlengenerator. Das Argument seed gibt den Startwert für die
Zufallszahlenfolge an, der auch als Ausgangswert für einen Neustart
dient. Die Funktion initstate() gibt einen Zeiger auf das vorherige
Array mit Statusinformationen aus.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
random(3) (BSD Compatibility Package) random(3)
Wurde initstate() nicht aufgerufen, verhält sich random() so, als wäre
initstate() mit dem Startwert seed = 1 und der Größe size = 128 aufge-
rufen worden.
Wird initstate() mit size >= 8 und < 32 aufgerufen, verwendet random()
einen einfachen linearen kongruenten Zufallszahlengenerator.
Nachdem ein Status initialisiert wurde, ermöglicht setstate() ein
Wechseln zwischen den Status-Arrays. Das durch das Argument state
definierte Array wird für die Generierung weiterer Zufallszahlen bis
zum nächsten Aufrufen von initstate() oder setstate() verwendet. Die
Funktion setstate() gibt einen Zeiger auf das vorherige Status-Array
aus.
BEISPIEL
/* Ein Array initialisieren und an initstate uebergeben */
static long state1[32] = {
3,
0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342,
0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd,
0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86,
0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7,
0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,
0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb,
0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b,
0xf5ad9d0e, 0x8999220b, 0x27fb47b9
};
main()
{
unsigned seed;
int n;
seed = 1;
n = 128;
initstate(seed, state1, n);
setstate(state1);
printf("%d0,random());
}
RÜCKGABEWERT
Die Funktion random() gibt die generierte Pseudo-Zufallszahl zurück.
Die Funktion srandom() gibt keinen Wert zurück.
Bei erfolgreicher Ausführung geben initstate() und setstate() einen
Zeiger auf das vorherige Status-Array zurück. Andernfalls wird ein
Nullzeiger zurückgegeben.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
random(3) (BSD Compatibility Package) random(3)
Wird die Funktion initstate() mit einer Größe kleiner als 8 aufgeru-
fen, gibt sie NULL zurück.
FEHLER
Es sind keine Fehler definiert.
ANWENDUNGSZWECK
Es gibt zwei Möglichkeiten, ein Status-Array nach der Initialisierung
an einem anderen Punkt neu zu starten:
- Es kann die Funktion initstate() verwendet werden, um den Start-
wert, das Status-Array und die Größe des Arrays festzulegen.
- Es kann zuerst die Funktion setstate() mit dem gewünschten Status
und anschließend die Funktion srandom() mit dem gewünschten Start-
wert verwendet werden. Der Vorteil bei der Verwendung beider Funk-
tionen liegt darin, daß die Größe des Status-Arrays nach der
Initialisierung nicht gesichert werden muß.
Es gibt zwar Implementierungen von random(), bei denen Meldungen auf
die Standard-Fehlerausgabe geschrieben werden, diese Implementierungen
entsprechen jedoch nicht dem vorliegenden Dokument.
SIEHE AUCH
drand48(3C), rand(3C), srand(3C), stdlib(5).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98