Delphi-Quellcode:
function randInt_MT19937(Range: LongInt): LongInt;
begin
Result := Range * genrand_MT19937;
end;
function randInt_MT19937(Min, Max: LongInt): LongInt;
begin
Result := randInt_MT19937(Max - Min) + Min;
end;
Ist es normal, dass randInt_MT19937(50, 60) alles zurückgibt, außer eine Zahl zwischen 50 und 60?
Die erste Funktion verstehe ich aber auch nicht. Wenn ich randInt_MT19937(100) eingebe, bekomme ich auch alles zurück. Aber es stoppt nicht bei der 50.
Negative Zahlen kommen auch manchmal raus.
Der
ASM-Code macht hingegen das was er soll.
Das hier mal Zeile für Zeile übersetzt
Delphi-Quellcode:
asm
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}
end;
Erst kommt Range in EAX. Dann wird das Resultat von genrand_MT19937 in EAX geschrieben. Range in EAX wird überschrieben.
Jetzt ist Range plötzlich in EDX (?) und danach wird EAX mit EDX multipliziert.