Zufallszahlen in HM-Script nutzen

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
owagner
(verstorben)
Beiträge: 1193
Registriert: 13.05.2008, 19:49
Danksagung erhalten: 1 Mal

Zufallszahlen in HM-Script nutzen

Beitrag von owagner » 20.04.2010, 17:44

Leider hat HM-Script aktuell keine Funktion zur Generierung von Pseudozufallszahlen. Mittels des Linux-Kernel-Zufallszahlengenerators /dev/urandom ud System.exec kann man sich aber behelfen:

Code: Alles auswählen

! *
! * 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);
Mittels "hexdump" werden die Binärdaten von /dev/urandom in eine Dezimalzahl verwandelt, der String-Split dient dazu, die Ausgabe von hexdump aufzuspalten. Per Aufruf wird eine 16-Bit-Zahl erzeugt, benötigt man eine Zahl in einem kleineren Bereich, muss man den Modulo-Operator anwenden.
Zuletzt geändert von owagner am 21.04.2010, 22:39, insgesamt 1-mal geändert.

chii
Beiträge: 80
Registriert: 26.06.2009, 23:34

Re: Zufallszahlen in HM-Script nutzen

Beitrag von chii » 21.04.2010, 22:17

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

Benutzeravatar
owagner
(verstorben)
Beiträge: 1193
Registriert: 13.05.2008, 19:49
Danksagung erhalten: 1 Mal

Re: Zufallszahlen in HM-Script nutzen

Beitrag von owagner » 21.04.2010, 22:40

Ooops, den Modulo-Operator gibt es doch? Gleich mal korrigieren..

Viele Grüße,
Olli

teddy278

Re: Zufallszahlen in HM-Script nutzen

Beitrag von teddy278 » 23.04.2010, 10:21

Dieser Beitrag wurde durch den Autor entfernt.

Toxikon
Beiträge: 15
Registriert: 08.10.2020, 17:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal

Re: Zufallszahlen in HM-Script nutzen

Beitrag von Toxikon » 08.10.2020, 17:41

Mir ist klar, dass der ursprüngliche Beitrag 10 Jahre alt ist. Dennoch muss ich eine Korrektur anbringen:

Code: Alles auswählen

var rand10=rand%10
erzeugt keine Zahl zwischen 0 und 10, sondern zwischen 0 und 9.

Code: Alles auswählen

var rand20=(rand%10)+10
erzeugt somit eine Zahl zwischen 10-19, nicht zwischen 10 und 20.

Es gibt allerdings (inzwischen?) eine deutlich bessere Methode, Zufallszahlen zu erzeugen.
Für die Berechnung von Zufallszahlen existieren die folgenden Funktionen:
system.Random(min, max)
Berechnung einer ganzzahligen Zufallszahl mit der optionalen Angabe eines akzeptieren Bereiches
Beispiel:

Code: Alles auswählen

var dice = system.Random(1, 6);
Quelle: https://www.eq-3.com/Downloads/eq3/down ... g_V2.2.pdf

alchy
Beiträge: 10761
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 675 Mal

Re: Zufallszahlen in HM-Script nutzen

Beitrag von alchy » 08.10.2020, 20:52

Ich weiß zwar was du sagen willst, aber

Code: Alles auswählen

var rand10=rand%10
erstmal gar nichts außer Fehler. :oops:

Der damalige Versuch war ja, wie auch geschrieben steht, eine Erzeugung auf Umwegen, weil es das noch nicht als Funktion gab.
owagner hat geschrieben:
20.04.2010, 17:44
Leider hat HM-Script aktuell keine Funktion zur Generierung von Pseudozufallszahlen.
Vielleicht war aber auch der Modulo-Operator damals noch "anders" gestrickt. :shock: Das auch später hinzugekommene .Mod() ist ja auch leicht anders gestaltet. Der TE owagner RiP :cry: wird es uns nicht mehr sagen können ob das damals auch so war.

Vor 10 Jahren waren zwar weit weniger über HM Script bekannt und erst Recht nicht dokumentiert. So hätte es zwar damals auch sein können das man einen Umweg erzeugt hat, obwohl es einfacher gehen würde.
ABER
Für .Random() gilt das nicht, denn das gibt es erst ab CCU-Firmware 2.29.18 bzw. ReGaHss-Version R1.00.0388.0108 und damit erst viel später als diesen Post.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Toxikon
Beiträge: 15
Registriert: 08.10.2020, 17:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal

Re: Zufallszahlen in HM-Script nutzen

Beitrag von Toxikon » 08.10.2020, 22:09

Ich weiß zwar was du sagen willst, aber

Code: Alles auswählen

var rand10=rand%10
erstmal gar nichts außer Fehler.
Natürlich nicht - es handelt sich ja nur um einen Ausschnitt aus dem Ursprungs-Beitrag.
Da es bisher keine anderen sinnvollen Beiträge zum Thema Zufallszahlen gibt und man bei der Google-Suche direkt hier landet, fand ich es sinnvoll, den fehlerhaften Ursprungsbeitrag zu korrigieren - der übrigens überhaupt nicht mit Modulo arbeitet.
Da es offenbar nicht klar ist, hier der Quelltext (mit FALSCH sind meine Anmerkungen gekennzeichnet):

Code: Alles auswählen

! *
! * 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  <---- FALSCH, richtig: zwischen 0-9
! *
var rand10=rand%10;
WriteLine(rand10);
! *
! * ...und zwischen 10-20  <---- FALSCH, richtig: zwischen 10-19
! *
var rand20=(rand%10)+10;
WriteLine(rand20);

alchy
Beiträge: 10761
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 675 Mal

Re: Zufallszahlen in HM-Script nutzen

Beitrag von alchy » 08.10.2020, 22:42

Mein Post sollte dir nur die Historie erklären, entschuldige kommt nicht wieder vor.
Toxikon hat geschrieben:
08.10.2020, 22:09
der übrigens überhaupt nicht mit Modulo arbeitet.
Aber natürlich, wie du meinst.

var rand10=rand%10;

modulo_operand.jpg
wie oben, entschuldige kommt nicht wieder vor.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Toxikon
Beiträge: 15
Registriert: 08.10.2020, 17:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal

Re: Zufallszahlen in HM-Script nutzen

Beitrag von Toxikon » 09.10.2020, 12:04

Argh - du hast natürlich recht, es war wohl schon zu spät gestern. Ich hatte ein anderes Script im Kopf - natürlich ist das Modulo :lol:

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“