Hallo,
ich habe hier vielleicht eine Alternative. Die ist zwar ein wenig komplizierter und auch nicht ganz so flexibel, dafür wird aber auf
system.Exec verzichtet:
1. Systemvariable _RANDOM_ anlegen
Die Systemvariable
_RANDOM_ ist vom Typ Zahl und enthält später die Zufallszahl.
2. Programm Random_Set anlegen
Das Programm
Random_Set wird alle 7 Minuten per Zeitmodul ausgeführt. Es soll bei jeder Ausführung eine neue Zufallszahl erzeugen. Daszu wird folgendes Skript ausgeführt (
SourceA):
Code: Alles auswählen
var a = 1291;
var b = 4691;
var m = 21870;
var sv_rand = dom.GetObject("_RANDOM_");
var rand = 0 + sv_rand.State();
rand = ((rand * a) + b) % m;
sv_rand.State(rand);
Der Zufallsgenerator basiert auf einem Kongruenzgenrator (
http://de.wikipedia.org/wiki/Kongruenzgenerator). Diese Art von Zufallsgeneratoren werden z.B. auch in der glibc oder in Java verwendet. Für die Werte für a, b und m musste ich ein wenig googeln - die Werte aus dem Source der glibc kamen mir etwas groß vor
.
3. Programm Random_Seed anlegen
Zum Abschluss sorgt das Programm
Random_Seed für die Initialisierung der Zufallszahl. Es besitzt keine Bedingung, damit es beim Start der CCU ausgeführt wird. Dabei startet es das folgende Script:
Code: Alles auswählen
var seed = system.Date("%S").ToInteger();
var sv_rand = dom.GetObject("_RANDOM_");
sv_rand.State(seed);
Ergebnis
Alle 7 Minuten steht eine neue Zufallszahl in der Systemvariable
_RANDOM_. Diese kann nun in Skripten verwendet werden. Zunächst sieht das vielleich ein wenig unflexibel aus - aber vielleicht reicht es ja für die meisten Zwecke.
Eine Alternative wäre, das Programm
Random_Set wegzulassen und dafür
SourceA vor jeder Verwendung auszuführen. Damit würden dann wirklich nur Zufallszahlen erzeugt werden, wenn man diese braucht und man kann auf das Zeitmodul verzichten.
Grüße
chii