Es ist mir bewusst, dass der Code aus #30 zusammengefasst werden kann. Es ging ja darum den
ASM Code Zeile für Zeile in Delphi zu schreiben.
Deine Zusammenfassung von #30 liefert bei mir bei einem Startwert von randseed=1 bereits beim zweiten Aufruf von random(1000000) nicht mehr den korrekten Wert zurück. Es liegt wahrscheinlich an meinen Compilerschaltern (?). Wenn du's so geschrieben hättest...
Delphi-Quellcode:
function random(aRange: Integer): Integer;
begin
{$Q-}
{$R-}
RandSeed := RandSeed * 134775813 + 1; // 3*17*131*20173
Result := (aRange * Cardinal(RandSeed)) shr 32; // aka Result := MulDiv(aRange, RandSeed, $100000000);
end;
...dann wäre auch mein australisches Delphi zufrieden.
Infos zum Verfahren:
https://de.wikipedia.org/wiki/Kongruenzgenerator