OSCAT Forum

oscat.lib => oscat.lib fuer TwinCAT/CoDeSys => Thema gestartet von: vladimirsitnikov am 22. Juli 2016, 12:04:27

Titel: _ARRAY_SHUFFLE uses weak shuffle approach
Beitrag von: vladimirsitnikov am 22. Juli 2016, 12:04:27
Here's what _ARRAY_SHUFFLE uses:
stop := UINT_TO_INT(SHR(size,2)-1);
FOR i := 0 TO stop DO
        pos := RDM2(i+pos,0,stop);
        (* swap elements *)
        temp := pt^[i];
        pt^[i] := pt^[pos];
        pt^[pos] := temp;
END_FOR;

Technically speaking, for Fisher–Yates shuffle (see https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) a loop of length "size" is required, not "size/2-1".

Does it make sense to correct the shuffle so it implemets Fisher-Yates properly?