Seite 1 von 2

[Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 10:57 am
von Robosoc
Fall mal jemand Zufallszahlen benötigt, ich habe einen kleinen Zufallszahlengenerator nach der Anleitung im Webartikel
https://www.lernhelfer.de/schuelerlexik ... allszahlen
geschrieben. Dieser Erzeugt gleichverteilte Zahlen von 1 - 99999, wobei es ein wiederkehrendes Muster ist und nicht alle Zahlen in diesem Muster vorkommen.

Irgendwann wird daraus vielleicht ein einfacher Abwesenheits-Lichtsimulator. Die Zufallszahlen sind keine echten Zufallszahlen und sollten nicht für IT-Sicherheitsanwendungen genutzt werden.

Da der Custom-Code die Funktion CalcFormula (Freie Formel) nutzt, geht der Code erst ab V2.0 IP4.

Der Code wird nicht automatisch getriggert und muss durch einen zu setzenden Trigger-Eingang ausgelöst werden.
Ich teste gerade mit einen zyklischen Trigger jede Sekunde und schreibe mir eine TimeSeries damit voll um zu sehen, wie gleichverteilt das Ganze ist.

[edit: Code in V1.1 eingefügt, weil V1.0 durch Rund Integer->Float Rundungsfehler nicht zufriedenstellend war (siehe Beiträge 2 und 3)]

Code: Alles auswählen

/**
* Pseudozufallszahlengenerator V1.1 - erzeugt Werte von 1 bis 99999 (exklusiv)
* erzeugt Zahlen, die weitestgehend dieselben Eigenschaften von echten Zufallszahlen haben, aber deterministisch (rekursiv) erzeugt werden und daher einem wiederkehrenden Muster unterliegen.
* nach folgendem Webartikel: https://www.lernhelfer.de/schuelerlexikon/mathematik-abitur/artikel/pseudozufallszahlen
*
* Nutzungsrechte:
* Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht. 
*/
{
  "Level": [
	["$Wert","integer",62347],
	["$Produkt","integer",0],
	["$Aufgerundet","bool",false],
	["$Out","integer",0],
	["$Faktor","integer",173],
	["$Formel_A","string","X1*X2"],
	["$Formel_B","string","(X1-rint(X1/100000)*100000+X2*100000)"],
	["$VAR<Inhibit?>","bool",false]
  ],
  "Module": [
	["Break", ["$VAR<Inhibit?>"]],
	["CalcFormula",["$Faktor","$Wert"], "$Produkt", "$Formel_A"],
	["CalcFormula",["$Produkt",0], "$Wert", "$Formel_B"],
	["Comparator" , "$Wert" , "-$Aufgerundet" , 0],
	["CalcFormula",["$Produkt","$Aufgerundet"], "$Wert", "$Formel_B"]
  ],  
  "Input": [
	["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
  ],
  "Output": [
	["Zahl","Pseudo-Zufallszahl von 1 bis 99999","$Wert","c"]
  ]
}

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 12:32 pm
von Robosoc
Schade der genutzte Algorithmus ist leider nicht sehr chaotisch und somit nicht wirklich zufällig....Schade, das hatte ich mir anders vorgestellt!

Nach etwas mehr als 1h habe ~4.000 Zufallszahlen generiert und die Verteilung ist wie folgt:
Bild

Leider ist auch das Muster zu deutlich zu erkennen:
Bild

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 12:59 pm
von Robosoc
hm...gerade entdeckt, dass die ersten 15 min. sehr brauchbare Werte geliefert hat und das Muster danach eingefallen ist:
Bild

Die Verteilung der ersten 830 recht chaotisch verteilten Werte war:
Bild

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 1:36 pm
von gbglace
Interessant.

Ich hätte da ja irgendwie um es halt pseudozufällig zu machen noch andere Faktoren verarbeitet die bei sowas die Startwerte von so einem Algorithmus definieren. Im TWS Umfeld könnte man so einen Startwert regelmäßig durch einen hoch aufgelösten Wert eines Stromzählers (Spannung, mA) oder so einfließen lassen. Das würde ich schon als recht variabel erachten, auch wenn man es später für eine Anwesenheitssimulation nutzt die den Startwert ja auch irgendwie indirekt beeinflusst.

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 1:45 pm
von Robosoc
Habe das ganze jetzt mal mit Excel überprüft und stelle fest, dass mein TWS-Custom-Code ab dem 51.ten Iterationsschritt zu Abweichungen im Ergebnis kommt...
Ich hatte schon beim Erstellen des Codes festgestellt, dass ich im TWS besser nicht mit float-Werten Arbeiten sollte, soweit es sich vermeiden lässt, weil da scheinbar irgendeine Rundung greift, die sonst nicht weiter auffällt oder Probleme bereitet (wer braucht schon normaler Weise eine 5.te oder 6.te Stelle nach dem Komma.). Deshalb habe ich im Code auch mit 100.000 multipliziert und dividiert...aber scheinbar hat das noch nicht gereicht.

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 1:51 pm
von Robosoc
gbglace hat geschrieben: Mo Jan 03, 2022 1:36 pm Ich hätte da ja irgendwie um es halt pseudozufällig zu machen noch andere Faktoren verarbeitet die bei sowas die Startwerte von so einem Algorithmus definieren.
Ja, dachte ich auch zunächst, aber die Wahl eines ungünstigen Startwertes kann sehr ungünstige Folgen für die Zufälligkeit haben. Wird der Startwert für einen Algorithmus nun also zufällig vorgegeben, dann kann das Ergebnis am Ende vielleicht schlechter sein, als mit einem fest vorgegebenen Startwert...Ich würde die Zufallsgenerator auch nicht immer wieder beim Startwert starten lassen, sondern ihn im Persistenzmodus halt inhibiten oder laufen lassen...für den Anwendungsfall Anwesenheitssimulator kommt man dadurch schon sehr weit. Die ersten 830 Werte in meinem Ergebnis sind meines Erachtens sehr gut geeignet und jetzt suche ich noch den Rundungsfehler... dann sollte das gut helfen.

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 2:28 pm
von Robosoc
So, nächster Versuch läuft mit 0,3Sek Taktung und ohne Float:D

Code: Alles auswählen

/**
* Pseudozufallszahlengenerator V1.1 - erzeugt Werte von 1 bis 99999 (exklusiv)
* erzeugt Zahlen, die weitestgehend dieselben Eigenschaften von echten Zufallszahlen haben, aber deterministisch (rekursiv) erzeugt werden und daher einem wiederkehrenden Muster unterliegen.
* nach folgendem Webartikel: https://www.lernhelfer.de/schuelerlexikon/mathematik-abitur/artikel/pseudozufallszahlen
*
* Nutzungsrechte:
* Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht. 
*/

{
  "Level": [
	["$Wert","integer",62347],
	["$Produkt","integer",0],
	["$Aufgerundet","bool",false],
	["$Out","integer",0],
	["$Faktor","integer",173],
	["$Formel_A","string","X1*X2"],
	["$Formel_B","string","(X1-rint(X1/100000)*100000+X2*100000)"],
	["$VAR<Inhibit?>","bool",false]
  ],
  "Module": [
	["Break", ["$VAR<Inhibit?>"]],
	["CalcFormula",["$Faktor","$Wert"], "$Produkt", "$Formel_A"],
	["CalcFormula",["$Produkt",0], "$Wert", "$Formel_B"],
	["Comparator" , "$Wert" , "-$Aufgerundet" , 0],
	["CalcFormula",["$Produkt","$Aufgerundet"], "$Wert", "$Formel_B"]
  ],  
  "Input": [
	["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
  ],
  "Output": [
	["Zahl","Pseudo-Zufallszahl von 1 bis 99999","$Wert","c"]
  ]
}

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 2:40 pm
von Robosoc
Ergebnis aus dem Code in Version V1.1 sieht nach ca. 2250 Iterationsschritten sehr sehr gut aus und stimmt mit meinem Ergebnis in Excel zu 100% überein:
Bild

Jetzt lasse ich es mal laufen und schaue mal, ab wann es doppelte Werte gibt oder sich ein ungewolltes Muster einstellt.

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 3:05 pm
von Robosoc
Nach ziemlich genau 5000 Werten wiederholt sich das Bild...aber 5000 Werte reichen mir... :D
Mache jetzt nicht mehr weiter

Re: [Custom-Code ab V2.0] Generator für Pseudo-Zufallszahlen

Verfasst: Mo Jan 03, 2022 3:08 pm
von Chris M.
gbglace hat geschrieben: Mo Jan 03, 2022 1:36 pm Ich hätte da ja irgendwie um es halt pseudozufällig zu machen noch andere Faktoren verarbeitet [...]
Sorry, aber bei einem Pseudo-Zufallsgenerator gilt das gleiche wie bei Kryptographie (sind ja sehr verwandte Themen): bitte niemals selber basteln! :shock:

Es gibt viele gute, veröffentlichte Algorithmen die lange von Experten geprüft wurden, so dass sichergestellt ist, dass die die Anforderungen erfüllen. :handgestures-thumbsup: