drand48(3C) drand48(3C)
NAME
drand48, erand48, lrand48, nrand48, mrand48, jrand48, srand48, seed48,
lcong48 - Gleichmäßig verteilte Pseudo-Zufallszahlen erzeugen
SYNTAX
#include <stdlib.h>
double drand48(void);
double erand48(unsigned short int xsubi[3]);
long int lrand48(void);
long int nrand48(unsigned short int xsubi[3]);
long int mrand48(void);
long int jrand48(unsigned short int xsubi[3]);
void srand48(long int seedval);
unsigned short int *seed48(unsigned short int seed16v[3]);
void lcong48(unsigned short int param[7]);
BESCHREIBUNG
Diese Familie von Funktionen erstellt Pseudo-Zufallszahlen unter
Anwendung des bekannten linearen Kongruenzalgorithmus und der 48-Bit-
Ganzzahlarithmetik.
Die Funktionen drand48() und erand48() liefern nichtnegative Gleitkom-
mazahlen doppelter Genauigkeit, die gleichmäßig über das Intervall
[0.0, 1.0] verteilt sind.
lrand48() und nrand48() liefern nichtnegative Ganzzahlen vom Typ long,
die gleichmäßig über das Intervall [0, 2^31) verteilt sind.
Die Funktionen mrand48() und jrand48() liefern ganze Zahlen vom Typ
long mit Vorzeichen, die gleichmäßig über das Intervall [-2^31, 2^31)
verteilt sind.
Die Funktionen srand48(), seed48() und lcong48() sind Funktionen für
die Initialisierung; eine dieser Funktionen ist aufzurufen, bevor ent-
weder drand48(), lrand48() oder mrand48() aufgerufen wird. Standardan-
fangswerte werden automatisch eingesetzt, wenn drand48(), lrand48()
oder mrand48() ohne vorherigen Aufruf einer Initialisierungsfunktion
aufgerufen werden; Sie sollten aber explizit initialisieren. Für die
Funktionen erand48(), nrand48() und jrand48() ist ein vorheriger Auf-
ruf einer Initialisierungsfunktion nicht erforderlich.
Bei allen Funktionen wird eine Folge von ganzzahligen 48-Bit-Werten
X sub i auf Grundlage der linearen Kongruenzformel erstellt:
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
drand48(3C) drand48(3C)
(vgl. Referenzhandbuch für Programmierer)
X sub{n+1} = (aX sub n + c) sub{ mod m} n>=0
Der Parameter m ist 2^48; folglich wird ganzzahlige 48-Bit-Arithmetik
ausgeführt. Wenn lcong48() nicht aufgerufen wurde, erhält man den Mul-
tiplikatorwert a und den Summand c durch:
a = 5DEECE66D sub 16 = 273673163155 sub 8
c = B sub 16 = 13 sub 8
Der von einer der Funktionen drand48(), erand48(), lrand48(),
nrand48(), mrand48() oder jrand48() gelieferte Wert wird berechnet,
indem man erst das nächste 48-Bit X sub i in der Folge berechnet. Dann
wird die entsprechende Bitanzahl, die jeweils vom Typ des zurückzuge-
benden Datenelements abhängt, von den links stehenden höherwertigen
Bits X sub i kopiert und in den Rückgabewert umgewandelt.
Die Funktionen drand48(), lrand48() und mrand48() speichern das
zuletzt erzeugte 48-Bit X sub i in einem internen Puffer. X sub i muß
vor Aufruf initialisiert werden. Für die Funktionen erand48(),
nrand48() und jrand48() muß Speicherplatz vom aufrufenden Programm für
die aufeinanderfolgenden X sub i-Werte in dem Feld bereitgestellt wer-
den, das beim Aufrufen der Funktionen als Argument angegeben wurde.
Diese Funktionen müssen nicht initialisiert werden; das aufrufende
Programm muß den gewünschten Anfangswert von X sub i in das Feld
schreiben und als Argument übergeben. Durch die Verwendung verschiede-
ner Argumente ermöglichen die Funktionen erand48(), nrand48() und
jrand48() separaten Modulen eines großen Programms die Erzeugung meh-
rerer unabhängiger Mengen von Pseudo-Zufallszahlen, d. h. die Folge
der Zahlen in einer Menge hängt nicht davon ab, wie oft diese Funktion
aufgerufen wurde, um Zufallszahlen für die anderen Mengen zu erzeugen.
Die Initialisierungsfunktion srand48() setzt die 32 höherwertigen Bits
von X sub i auf die in ihrem Argument enthaltenen 32 Bits. Die nieder-
wertigen 16 Bits von X sub i werden auf den Wert 330E sub 16 gesetzt.
Die Initialisierungsfunktion seed48() setzt den Wert von X sub i auf
den 48-Bit-Wert, der im Argumentfeld angegeben wurde. Außerdem wird
der vorherige Wert von X sub i in einen internen 48-Bit-Speicher
kopiert, der nur von seed48() benutzt wird. Ein Zeiger auf diesen Puf-
fer ist der von seed48() zurückgegebene Wert. Dieser zurückgegebene
Zeiger kann einfach ignoriert werden, wenn er nicht benötigt wird. Er
ist jedoch nützlich, wenn ein Programm später einmal von einem
bestimmten Punkt aus neugestartet werden soll. Verwenden Sie den Zei-
ger, um auf den letzten X sub i-Wert zu gehen und diesen Wert zu spei-
chern. Verwenden Sie den Wert dann zum Neuinitialisieren über
seed48(), wenn das Programm neugestartet wird.
Die Initialisierungsfunktion lcong48() ermöglicht dem Anwender die
Angabe des anfänglichen X sub i, des Multiplikatorwerts a und des
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
drand48(3C) drand48(3C)
Summanden c. Die Argumentfeldelemente param[0-2] geben X sub i an,
param[3-5] geben den Multiplikator a und param[6] den 16-Bit-Summanden
c an. Nach dem Aufruf von lcong48() werden die oben angegebenen Werte
für "Standard"-Multiplikator und Summand, d. h. a und c, mit einem
anschließenden Aufruf von entweder srand48() oder seed48() wieder her-
gestellt.
SIEHE AUCH
rand(3C).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98