Aus einem interessanten aber relativ komplizierten Algorithmus habe ich diese Funktion
Delphi-Quellcode:
function randInt_MT19937(Range: LongInt): LongInt;
asm
PUSH EAX
CALL genrand_MT19937
POP EDX
MUL EDX
MOV EAX,EDX
end;
Das ist im Prinzip ein Random().
Der parameter Range wird in EAX geschrieben. Wie würde diese Funktion aber aussehen, wenn als Parameter
Min, Max: LongInt
dort stände?
https://www.guidogybels.eu/asmch2.html
Hier steht man schreibt den zweiten Parameter in EDX aber der wird schon verwendet.
Danach wird genrand_MT19937 aufgerufen. Aber woher weiß die Funktion, was
Range
ist?
Delphi-Quellcode:
function genrand_MT19937: LongInt;
const
mag01: array [0 .. 1] of LongInt = (0, MT19937MATRIX_A);
var
y: LongInt;
kk: Integer;
begin
if mti >= MT19937N{generate MT19937N longints at one time}
then
begin
if mti = (MT19937N + 1) then // if sgenrand_MT19937() has not been called,
sgenrand_MT19937(4357); // default initial seed is used
for kk := 0 to MT19937N - MT19937M - 1 do
begin
y := (mt[kk] and MT19937UPPER_MASK) or (mt[kk + 1] and MT19937LOWER_MASK);
mt[kk] := mt[kk + MT19937M] xor (y shr 1) xor mag01[y and $00000001];
end;
for kk := MT19937N - MT19937M to MT19937N - 2 do
begin
y := (mt[kk] and MT19937UPPER_MASK) or (mt[kk + 1] and MT19937LOWER_MASK);
mt[kk] := mt[kk + (MT19937M - MT19937N)] xor (y shr 1) xor mag01[y and $00000001];
end;
y := (mt[MT19937N - 1] and MT19937UPPER_MASK) or (mt[0] and MT19937LOWER_MASK);
mt[MT19937N - 1] := mt[MT19937M - 1] xor (y shr 1) xor mag01[y and $00000001];
mti := 0;
end;
y := mt[mti];
inc(mti);
y := y xor (y shr 11);
y := y xor (y shl 7) and TEMPERING_MASK_B;
y := y xor (y shl 15) and TEMPERING_MASK_C;
y := y xor (y shr 18);
Result := y;
end;
Die
Unit gibt es hier
http://www.gokiburi.de/MT19937.pas