Danach wird genrand_MT19937 aufgerufen. Aber woher weiß die Funktion, was Range
ist?
Das muss sie gar nicht.
genrand_MT19937 liefert einen zufälligen Longint zurück, der in Folge mit Range multipliziert wird. Da diese Multiplikation in 32-Bit durchgeführt wird, entspricht das einem impliziten modulo 2^32. Man kann nachweisen, daß das Ergebnis kleiner als die beiden Multiplikanden ist (kann den Nachweis nur gerade nicht finden).
Der
ASM-Code liest sich in etwa so:
Delphi-Quellcode:
PUSH EAX { Parameter 1 = Range auf Stack sichern }
CALL genrand_MT19937 { Random Longint aufrufen, Ergebnis steht in EAX (keine Parameter)}
POP EDX { Range vom Stack in EDX holen }
MUL EDX { EAX mit EDX multiplizieren }
MOV EAX,EDX { Ergebnis in result = EDX zurückgeben }
Wenn du einen Range-Min/Max willst, würde ich einen Wrapper um diese Funktion machen:
Delphi-Quellcode:
function RandInt_Range(AMin, AMax: Longint): Longint;
begin
Result := randInt_MT19937(AMax - AMin) + AMin;
end;