Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

initstate, random, setstate, srandom - Pseudozufallszahlen generieren

&pagelevel(4)&pagelevel

Definition

#include <stdlib.h>

char *initstate(unsigned int seed, char *state, size_t size);

long random(void);

char *setstate(const char *state);

void srandom(unsigned int seed); 

Beschreibung

random() verwendet einen nichtlinearen, additiven Feedback-Zufallszahlengenerator und setzt einen Standard-Statusvektor mit der Größe von 31 langen Ganzzahlen ein, um aufeinander folgendanderfolgende Pseudo-Zufallszahlen im Bereich von 0 bis 231-1 zu generieren. Die Periode dieses Zufallszahlengenerators ist sehr groß, und zwar etwa 16 x (231-1). Die Größe des Statusvektors bestimmt die Periode des Zufallszahlengenerators. Wird ein größerer Statusvektor verwendet, so verlängert sich die Periode.

Bei 256 Byte Status-Information ist die Periode des Zufallszahlengenerators größer als 269.

Ebenso wie rand() erzeugt random() standardmäßig eine Folge von Zahlen, die dadurch dupliziert werden können, indem zuvor srandom() mit seed gleich 1 aufgerufen wird.

srandom() initialisiert den aktuellen Statusvektor mit dem Inhalt von seed.

Die Funktionen initstate() und setstate() behandeln den Neustart und die Modifizierung von Zufallszahlen-Generatoren. Mit initstate() kann der Statusvektor, auf den das Argument state zeigt, zur späteren Verwendung initialisiert werden. Das Argument size gibt dabei die Größe des Statusvektors in Byte an. initstate() verwendet size, um festzustellen, wie anspruchsvoll der eingesetzte Zufallszahlengenerator sein soll - je mehr Statusinformationen, desto besser die generierten Zufallszahlen. Optimale Werte für die Anzahl der Statusinformationen sind 8, 32, 64, 128 und 256 Byte; andere Angaben > 8 werden auf den nächst niedrigeren der vorgenannten Werte abgerundet. Für Werte < 8 verwendet random() einen einfachen, linear kongruenten Zufallszahlen-Generator. Das Argument seed bestimmt den Startwert für die Initialisierung, durch die ein Anfangspunkt für die Zufallszahlenfolge angegeben wird, der gleichzeitig auch für einen Neustart dient. initstate() gibt einen Zeiger auf den vorherigen Vektor mit Statusinformationen zurück.

Wenn random() aufgerufen wird, ohne dass zuvor initstate() ausgeführt wurde, so verhält sich random() so, als ob initstate() zuvor mit seed=1 und size=128 abgelaufen wäre.

Nachdem ein Status initialisiert wurde, ermöglicht die Funktion setstate() ein schnelles Wechseln der Statusvektoren. Der Statusvektor, auf den state zeigt, wird für die Generierung

weiterer Zufallszahlen bis zum nächsten Aufruf von initstate() oder setstate() verwendet. setstate() gibt einen Zeiger auf den vorherigen Statusvektor zurück.

inistate() ist nicht threadsicher. Verwenden Sie bei Bedarf die reentrante Funktion rand_r(). 

Returnwert

random():

Pseudo-Zufallszahl



Die Funktion ist immer erfolgreich.                                                                           


initstate() und setstate():

Zeiger auf den vorherigen Statusvektor



bei Erfolg.

 

Nullzeiger

bei Fehler

Hinweis

Nachdem ein Statusvektor initialisiert wurde, kann er an anderer Stelle neu gestartet werden:

  • indem initstate() mit dem gewünschten Startwert, dem Statusvektor und dessen Größe aufgerufen wird.

  • indem setstate() mit dem Statusvektor und anschließend srandom() mit dem gewünschten Startwert aufgerufen wird. Der Vorteil beim Aufrufen dieser beiden Funktionen liegt darin, dass die Größe des Statusvektors nach dessen Initialisierung nicht abgespeichert werden muss.

Beispiel

Mit den folgenden Anweisungen wird ein Statusvektor initialisiert, an initstate() übergeben und eine mit random() erzeugte Zufallszahl ausgegeben:

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("%d", random());
}

Siehe auch drand48(), rand(), rand_r(), srand(), stdlib.h.