Zufahlszahlen generieren

  • Stand: Freitag, 11 Januar 2013
  • Artikel:
Benötigt man eine Zufallszahl, ist es derzeit nicht möglich, sich diese mit Bordmitteln der HomeMatic-Zentrale generieren zu lassen. Die folgenden zwei Ansätze zeigen aber, wie man annähernd eine Zufallszahl erzeugen kann, um diese dann z.Bsp. in anderen Programmen/Skripten weiterverwenden zu können.

Zufallszahlen via "urandom"

Der erste Ansatz nutzt eine spezielle Datei des Betriebssystems (/dev/urandom), von der Benutzerprogramme Zufallszahlen lesen können. Diese Datei ist eine einheitliche Schnittstelle zu einem systemweiten Zufallsgenerator (weitere Informationen dazu auf Wikipedia).

Mittels HEXDUMP wird nun der Inhalt dieser Datei gelesen, in eine Dezimalzahl gewandelt und als String-Variante entsprechend aufgespaltet:
! *
! * Beispiele fuer Zufallszahlen per HM-Script
! *
string stdout;
string stderr;
system.Exec("hexdump -d -n 2  /dev/urandom",&stdout,&stderr);

! * Zahl zwischen 0-65535
var rand=stdout.StrValueByIndex(" ",3).ToInteger();
WriteLine(rand);

! *
! * ...und zwischen 0-10
! *
var  rand10=rand%10;
WriteLine(rand10);

! *
! * ...und zwischen 10-20
! *
var rand20=(rand%10)+10;
WriteLine(rand20);

Zufallszahlen auf Basis eines Kongruenzgenerators

Die Kongruenzgeneratoren bilden eine Klasse von Algorithmen, die zufällig  aussehende Zahlenfolgen erzeugen. Die dadurch erzeugten Zahlen nennt man Pseudozufallszahlen, da sie deterministisch erzeugt werden und somit nicht wirklich zufällig sind. Kongruenzgeneratoren sind die bekanntesten und meistverwendeten rekursiven arithmetischen Zufallszahlengeneratoren. (Quelle: Wikipedia)
Der Vorteil dieses Ansatzes ist der Verzicht auf die Funktion »system.Exec«, die u.U. den Betrieb der HomeMatic-Zentrale stören kann.
Zunächst muss eine neue Systemvariable vom Typ »Zahl« angelegt werden, die in unserem Beispiel den Namen »_RANDOM_« erhält. Anschließend erstellt man ein neues Programm (Beispielname: »RANDOM_SET«), dass die eigentliche Zufallszahl in folgendem Skript berechnet:
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);
Das Programm wird über das Zeitmodul in der »Wenn«-Bedingung alle 7 Minuten ausgeführt und erzeugt jeweils eine neue Zahl, die anschließend über die Systemvariable »_RANDOM_« abgefragt und benutzt werden kann.

Abschließend erstellt man ein weiteres Programm (Beispielname: »RANDOM_SEED«), das diesmal aber keine Wenn-Bedingung enthält und somit nur einmalig beim Starten des HomeMatic-Zentrale ausgeführt wird:
var seed = system.Date("%S").ToInteger();
var sv_rand = dom.GetObject("_RANDOM_");

sv_rand.State(seed);
Das Skript sorgt für die Initialisierung der Zufahlszahl und nutzt dazu den aktuellen Zeitstempel des Systems.

Kommentare (1)

  • Ralph Punga-Kronbergs

    Ralph Punga-Kronbergs

    10 April 2017 um 00:43
    Kurze Frage: In welchem Wertebereich (Min/Max) befindet sich der Wert der Variable _RANDOM_ nach Generierung?

    antworten

Einen eigenen Kommentar verfassen

Du musst auf dieser Seite angemeldet sein, um einen Kommentar für diesen Artikel verfassen zu können.
Soll es schnell gehen? Dann melde Dich jetzt einfach über Dein soziales Netzwerk an:

Kommentare // TecBase

Ralph Punga-Kronbergs

Ralph Punga-Kronbergs

10. April, 2017 |

Kurze Frage: In welchem Wertebereich (Min/Max) befindet sich der Wert der Variable _RANDOM_ nach Generierung?

Gonzalo Jacob

Gonzalo Jacob

31. Dezember, 2016 |

Hallo, Admin !
vielleicht können Sie mir helfen, Ich habe keine Ahnung, wie ich einen Anwesenheitsimulator zum Ein- und Ausschalten...