Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

drand48, erand48, jrand48, lcong48, lrand48, mrand48, nrand48, seed48, srand48 - Pseudo-Zufallszahlen generieren

&pagelevel(4)&pagelevel

Definition

#include <stdlib.h>

double drand48 (void);
double erand48 (unsigned short int xsubi[3]);
long int jrand48 (unsigned short int xsubi[3]);
void lcong48 (unsigned short int param[7]);
long int lrand48 (void);
long int mrand48 (void);
long int nrand48 (unsigned short int xsubi[3]);
unsigned short int *seed48 (unsigned short int seed16v[3]);
void srand48 (long int seedval);

Beschreibung

Diese Familie von Funktionen erzeugt Pseudo-Zufallszahlen unter Verwendung eines Algorithmus der linearen Kongruenz und von ganzzahliger 48-Bit-Arithmetik.

drand48() und erand48() liefern nichtnegative Gleitpunktzahlen 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.

mrand48() und jrand48() liefern vorzeichenbehaftete Ganzzahlen vom Typ long, die gleichmäßig über das Intervall [-2 31 , 2 31 ] verteilt sind.

srand48(), seed48() und lcong48() sind Initialisierungsprozeduren, von denen eine vor dem Aufruf von entweder drand48(), lrand48() oder mrand48() aufgerufen werden sollte. Obwohl nicht empfohlen wird drand48(), lrand48() oder mrand48() ohne vorhergehenden Initialisierungsaufruf aufzurufen, werden für diesen Fall automatisch voreingestellte Anfangswerte zur Verfügung gestellt.

erand48(), nrand48() und rand48() benötigen keinen vorausgehenden Initialisierungsaufruf.

Alle Prozeduren arbeiten mit einer Sequenz von ganzzahligen 48-Bit Werten Xi, die der linear kongruenten Formel entsprechend gebildet werden:

X n+1 = ( aX n + c ) mod m n>=0

Für den Parameter m gilt: m = 2 48 ; es wird 48-Bit Ganzzahlarithmetik betrieben. Sofern nicht lcong48() aufgerufen wurde, ist der Wert des Faktors a und der additiven Konstanten cgegeben durch:

a = 5DEECE66D 16 = 2736731631558
c = B 16 = 138

Jedes Ergebnis einer der Funktionen drand48(), erand48(), lrand48(), nrand48(), mrand48() oder jrand48() entsteht folgendermaßen: Zuerst wird das nächste 48-Bit Reihenelement Xi berechnet. Dann werden, je nach Datentyp der Rückgabevariablen, entsprechend viele Bits aus dem höchstwertigen Anteil von Xi (äußere linke Bits) kopiert und in das Ergebnis umgewandelt.

Die Funktionen drand48(), lrand48() und mrand48() speichern den zuletzt erzeugten 48-Bit Wert Xi in einem internen Puffer; dies ist auch der Grund, weshalb sie vor dem ersten Aufruf initialisiert werden müssen. Die Funktionen erand48(), nrand48() und jrand48() erwarten vom aufrufenden Programm die Bereitstellung von Speicherplatz für die sukzessiven Werte Xi in Form eines Vektors, der beim Aufruf als Parameter übergeben wird. Deswegen brauchen diese Funktionen nicht initialisiert zu werden; das aufrufende Programm muss lediglich den benötigten Anfangswert von Xi in dem Vektor ablegen und diesen als Argument übergeben.

Durch die Verwendung verschiedener Argumente erlauben es die Funktionen erand48(), nrand48() und jrand48(), in getrennten Modulen größerer Programme mehrere unabhängige Folgen von Pseudo-Zufallszahlen zu generieren, d.h., die Reihenfolge der Zahlen in einer Folge ist nicht abhängig davon, wie oft die Routinen für die Generierung von Zahlen in anderen Folgen aufgerufen wurden.

Die Initialisierungsfunktion srand48() setzt die höherwertigen 32 Bit von Xi auf den Wert der {LONG_BIT} Bits ihres Arguments. Die niederwertigen 16 Bit von Xi werden mit dem willkürlichen Wert 330E16 belegt.

Die Initialisierungsfunktion seed48() setzt den Wert von Xi auf den 48-Bit Wert, der im übergebenen Vektor angegeben wird. Zusätzlich wird der frühere Wert von Xi in einem internen 48-Bit Puffer abgespeichert, der nur von seed48() verwendet und dessen Adresse von seed48() zurückgegeben wird. Dieser zurückgegebene Zeiger kann ignoriert werden, wenn er nicht benötigt wird. Er ist jedoch nützlich, falls ein Programm zu irgendeinem späteren Zeitpunkt von einer gegebenen Stelle aus neu gestartet werden soll. Es kann den Zeiger dazu benutzen, den letzten Wert von Xi zu ermitteln und abzuspeichern, um dann durch seed48() diesen Wert für eine Reinitialisierung beim Neustart zu verwenden.

Die Initialisierungsfunktion lcong48() erlaubt dem Benutzer, die Voreinstellungswerte von Xi, des Faktors a und der additiven Konstanten c festzulegen. Die Vektorelementeparam [0] bis param [2] legen Xi fest, param [3] bis param [5] legen den Faktor a und param [6] legt die 16-Bit Additionskonstante c fest. Nach dem Aufruf von lcong48() wird ein nachfolgender Aufruf von entweder srand48() oder seed48() diesen "Standard"-Faktor a und die additive Komponente c wiederherstellen, wie oben angegeben.

Returnwert

Siehe oben im Abschnitt „Beschreibung“.

Siehe auch rand(), stdlib.h.