call random_number(random)Dabei ist random ein Skalar oder Array vom Typ real, der nach dem Aufruf die Zufallszahl bzw. einen ganzen Satz von Zufallszahlen enthält. Wiederholte Aufrufe liefern aufeinanderfolgende Zufallszahlen aus der Sequenz des Generators. Der momentane Status des Generators ist in einem Vektor seed vom Typ integer gespeichert und kann mit
call random_seed(get=seed)abgefragt und mit
call random_seed(put=seed)gesetzt werden. Die (installationsabhängige) Länge length des Vektors seed kann man mit
call random_seed(size=length)abfragen. Die Möglichkeit, den Status des Generators auszulesen bzw. zu setzen, ist wichtig, wenn man eine lange, zusammenhängende Simulation in kürzere Teilabschnitte zerlegen will: Man liest am Ende jeder Teilrechnung den Status des Generators aus und initialisiert ihn damit am Beginn der nächsten. Will man (für Testzwecke) mehrere Male exakt dieselbe Folge von Zufallszahlen bekommen, so muß man zu Beginn jeweils den Generator auf denselben Ausgangszustand setzen. In F von Imagine1 war ursprünglich der "Minimalgenerator"
|
|
random=drand48();oder direkt an Stelle eines double- oder float-Werts in numerischen Ausdrücken verwendet werden. Der interne Status wird in einem 3-elementigen Vektor seed von vorzeichenlosen ganzen 16-Bit-Zahlen gespeichert und kann mit
unsigned short int dummy[3];ausgelesen und mit
unsigned short int *seed;
...
seed=seed48(dummy);
unsigned short int seed[3];gesetzt werden. Im ersten Fall ist dummy eine (eigentlich überflüssige, aber verlangte) Hilfsvariable vom selben Typ wie der Statusvektor seed, denn die Funktion seed48 setzt sowohl den Statusvektor auf den neuen, als Argument übergebenen Wert und gibt gleichzeitig einen Pointer auf den alten Statusvektor zurück. Der verwendete Generator ist
...
seed48(seed);
|