Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ReGaHSS: .Random() -> unplausible Werte bei kleineren Werten im 2. Parameter #2598

Closed
BadenPower opened this issue Jan 9, 2024 · 5 comments
Labels
🐛 bug-report Something isn't working 🏷️ ReGaHss This refs the ReGaHss component

Comments

@BadenPower
Copy link

BadenPower commented Jan 9, 2024

Describe the issue you are experiencing

  1. Wird die Methode .Random() ausgeführt, wobei der Wert des 2. Parameters niederer als der Wert des 1. Parameters ist, dann werden unplausible Werte zurückgegeben.

  2. Wird die Methode .Random() ausgeführt, wobei der Wert des 2. Parameters um 1 niederer als der Wert des 1. Parameters ist, dann stürzt der ReGaHss-Prozess ab.
    Dieses Fehlerbild tritt nicht bei der Verwendung einer CCU3, unabhängig der verwendeten ReGaHSS-Version, auf.

Describe the behavior you expected

Erwartet würde eine Ausgabe von Werten, welche zwischen beiden Endpunkten inklusive Endpunkte liegen, so als wären die Parameter in umgekehrter Reihenfolge in der Methode eingetragen.

Steps to reproduce the issue

Ausführung des folgenden Skriptes unter "Skript testen":

WriteLine("Start");
WriteLine(dom.BuildLabel()); 
WriteLine("-----------------------------");
integer lResult;
lResult = system.Random();
WriteLine(lResult);
lResult = system.Random(-1,2147483647);
WriteLine(lResult);
lResult = system.Random(200,201);
WriteLine(lResult);
lResult = system.Random(-100,-10);
WriteLine(lResult);
WriteLine("-----------------------------");
lResult = system.Random(2147483647,-1);
WriteLine(lResult);
lResult = system.Random(10,-1);     !gibt Zahlen zwischen 10 und 19 aus
WriteLine(lResult);
lResult = system.Random(1,-1);     !gibt immer 1 aus
WriteLine(lResult);
lResult = system.Random(-10,-12);   !gibt immer -10 aus
WriteLine(lResult);
lResult = system.Random(-10,-13);   !gibt -10 oder -9 aus
WriteLine(lResult);
lResult = system.Random(-10,-14);   !gibt -10, -9 oder -8 aus
WriteLine(lResult);
lResult = system.Random(-10,-15);   !gibt -10, -9, -8 oder -7 aus
WriteLine(lResult);
lResult = system.Random(-100000,-10000000);   !gibt positive Zahlen aus
WriteLine(lResult);
lResult = system.Random(-10,-10000);   !gibt positive Zahlen aus
WriteLine(lResult);
lResult = system.Random(-10,-100);   !gibt negative Zahlen im 1-stelligen Bersich und auch positive Zahlen aus
WriteLine(lResult);
!lResult = system.Random(2,1);
!WriteLine(lResult);
!lResult = system.Random(500,499);
!WriteLine(lResult);
WriteLine("-----------------------------");
lResult = system.Random(12,10);
WriteLine(lResult);
lResult = system.Random(13,10);
WriteLine(lResult);
lResult = system.Random(14,10);
WriteLine(lResult);
lResult = system.Random(100,10);
WriteLine(lResult);
WriteLine("-----------------------------");
WriteLine("Ende");

What is the version this bug report is based on?

CCU3 mit ReGaHSS-Version R1.00.0388.0235

Which base platform are you running?

rpi3 (RaspberryPi3)

Which HomeMatic/homematicIP radio module are you using?

n/a

Anything in the logs that might be useful for us?

bestehend seit:
ab ReGaHss-Version R1.00.0388.0108 (12.05.2017)

Additional information

Ausgabe des Skriptes:

Start
R1.00.0388.0235
-----------------------------
202031057
1269361078
200
-21
-----------------------------
-912929490
14
1
-10
-10
-9
-7
5807987
2557
13
-----------------------------
12
14
15
119
-----------------------------
Ende
@BadenPower BadenPower added the 🐛 bug-report Something isn't working label Jan 9, 2024
@jens-maus jens-maus added the 🏷️ ReGaHss This refs the ReGaHss component label Jan 9, 2024
@jens-maus jens-maus added this to the future release milestone Jan 10, 2024
@jens-maus
Copy link
Owner

Danke für den Bugreport. Die von dir aufgeführten Probleme konnte ich mit dem Beispielskript entsprechend nachvollziehen. Jedoch sehe ich auch das in einigen Aufrufen min und max vertauscht sind. D.h. die Random() Funktion ist ja eigentlich wie folgt definiert:

system.Random(min, max) 

In dem Beispielskript werden allerdings Werte angegeben wo min > max ist. So z.B.

lResult = system.Random(2147483647,-1);
[...]
lResult = system.Random(500,499);

usw. Die Frage die sich hier natürlich bei einer Verbesserung bzw. einem Fix der Random() Funktion stellt wäre, was sollte am besten passieren wenn wie hier die min und max Werte nicht korrekt an die Random() Funktion übergeben werden da eben in den Aufrufen min > max ist? Sollte dann ein ScriptRuntimeError erzeugt werden oder soll die Random() funktion z.B. einfach immer -1 (oder einen anderen Standardwert) zurückgeben? Das wäre noch zu klären.

@Baxxy13
Copy link
Contributor

Baxxy13 commented Jan 11, 2024

Ich wäre für Rückgabe eines Default-Wertes gepaart mit z.B.
ReGaHss: WARNING: incorrect use of Random() (use .Random(min, max))

@jens-maus
Copy link
Owner

Ich wäre für Rückgabe eines Default-Wertes gepaart mit z.B. ReGaHss: WARNING: incorrect use of Random() (use .Random(min, max))

Das sehe ich prinzipiell auch so. Aber was sollte dieser "Default-Wert" sein? -1 oder 65535 ? Oder ähnliches?

@BadenPower
Copy link
Author

Einen Defaultwert zu setzen würde ich nicht gerne unterstützen, da dies kein zufälliger Wert wäre, was der Methodenname jedoch suggeriert.

Schauen wir uns einmal die Funktion rand() aus PHP an.
Diese Funktion kann dort auch mit 2 Parametern aufgerufen werden, welche in der Dokumentation mit "min" und "max" bezeichnet werden. Dabei spielt es bei der Berechnung der Zufallzahl dann aber dennoch keine Rolle, an welcher Position der minimale oder maximale Wert steht. Es werden in beiden Fällen die gleichen Zufallzahlen zwischen und inklusive dem minimalen und maximalen Wert zurückgegeben.

Unterschlagen darf man jedoch nicht die Methode mt_rand ebenso aus PHP. Dort wird bei umgedrehten Werten "false" zurückgegeben. Diese Rückgabe würde ich allerdings auch nicht als erstrebenswert erachten, da die Funktion dann zwei verschiedene Variabletypen zurückgeben könnte, was zum Beispiel bei einer Verkettung

c = a + system Random(100,1);

zu Probelmen führen kann.

Somit tendiere ich dazu die Ausgabe gleichzustellen, egal in welcher Reihenfolge sich der maximale und minimale Wert befindet.

@jens-maus
Copy link
Owner

Schauen wir uns einmal die Funktion rand() aus PHP an. Diese Funktion kann dort auch mit 2 Parametern aufgerufen werden, welche in der Dokumentation mit "min" und "max" bezeichnet werden. Dabei spielt es bei der Berechnung der Zufallzahl dann aber dennoch keine Rolle, an welcher Position der minimale oder maximale Wert steht. Es werden in beiden Fällen die gleichen Zufallzahlen zwischen und inklusive dem minimalen und maximalen Wert zurückgegeben.

Nach kurzem Blick in die Beschreibung der rand() Funktion in PHP (siehe https://www.php.net/manual/de/function.rand.php) erscheint mir diese Vorgehensweise in der Tat ein guter Kompromiss zu sein. D.h. ich werde mal schauen ob ich das entsprechend umgesetzt bekomme das wenn min > max ist, ich dann die beiden Werte einfach austausche. Das sollte dann hoffentlich alle hier aufgezeigten Probleme mit der Random() Funktion sofort beseitigen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛 bug-report Something isn't working 🏷️ ReGaHss This refs the ReGaHss component
Projects
Development

No branches or pull requests

3 participants