Aber warum Du das machst und wofür Idx1 oder die Zwischenvariablen benötigt werden, erschließt sich mir so nicht direkt.
Stimmt schon, hucki, das ist zu kurz gekommen.
grR ist das Ergebnis der hier realisierten Random-Funktion.
grR soll Werte m Bereich > 0.0 und < 1.0 annehmen.
Um den nächsten Random-Wert zu erhalten, wird mit 997 mulitpliziert.
Aber dadurch entstehen auch "VorkommaStellen", die wieder plattgemacht werden sollen.
Beim hp97 gab es dafür die Funktion 'Frac'.
'grR := FRAC(grR * 997.0)' ist das, was ich eigentlich tun möchte. Notwendigkeit für ZwischenVariable: Null,Nix.
In
CodeSys habe ich nichts Entsprechendes gefunden. Auch nicht die INT-Funktion, die die NachkommaStellen plattmacht und die man von diversen Sprachen her gewohnt ist.
Auf diesem Umweg hätte man 'Frac := rX - INT(rX)' realisieren können. Also von der kompletten Zahl mit Vorkomma- und Nachkomma-Stellen die um die NachkommaStellen beschnittene Zahl subtrahieren. Bleiben die NachkommaStellen.
Habe, um INT zu "workarounden", also die NachkommaStellen abzuschneiden, GleitkommaZahl in Ganzzahl und dann zurück Ganzzahl im GleitkommaZahl missbraucht (in der Hoffnung, dass CodeSys dabei - anders als die LOGO! -
nicht auf die Idee kommt, zu runden).
Wenn es denn die MOD-Funktion auch für REAL-Zahlen gäbe, hätte ich 'grR := (grG * 997.0) MOD 1.0' geschrieben. Hier auch kein Bedarf für eine ZwischenVariable.
Ja, warum die ZwischenVariable. Hätte ich's ohne ZwischenVariable programmiert ('grR := grR * 997.0 - Int_To_Real(Real_To_Int(grR * 997.0))') , wäre bestimmt die Frage gekommen, warum ohne ZwischenVariable!

Meine Argumente für die ZwischenVariable:
- weil das Ergebnis der Multiplikation anschliessend mehr als einmal (nämlich zweimal) benötigt wird
- weil man beim Testen manchmal auch ein ZwischenErgebniss sehen/kontrollieren möchte.
Zu den beiden Indizes. Diese werden anschliessend benötigt, um zwei zufällig ausgeguckte Elemente des Array zu tauschen.
grR hat, wie gesagt, den WerteBereich > 0.0 bis < 1.0 und für die Indizes benötigen wir die Zahlen 0 .. 6. Die dritte Zeile skaliert die ZufallsZahl dementsprechend.
Wird für beide Indizes zufällig derselbe Wert geliefert, so wird auf den ersten IndexWert eine 3 addiert und das Ergebnis per MOD 7 wieder in den zulässigen Bereich 0 .. 6 "umgebogen".
Es ist auf diesem Wege nicht nötig, solange Zufallszahlen zu bilden, bis mal eine kommt, die für Index2 eine andere Zahl liefert, als Index1 zugewiesen wurde.
Es würde aber auch nichts schlimmes passieren, wenn beide Indizes mal denselben Wert hätten. Dann würde überflüssigerweise ein ArrayElement gegen sich selbst ausgetauscht.
Ja, das passiert mir auch: wenn ich nach einiger Zeit versuche, meinen Code zu enträtseln, dann merke ich natürlich auch, wo überall Kommentare fehlen.
