interface procedure InitRandomGenerator(InitValue : longint); function Random:real; implementation type Lint = record a,b,c,d : word; end; var yWertZufall : Lint; Modul : Lint; Faktor : integer; procedure LintMUL(var p1: Lint; p2: integer); begin asm mov cx,4 les di,p1 xor bx,bx cld @mull: mov ax,es:[di] mov dx,p2 mul dx add ax,bx adc dx,0 mov bx,dx stosw loop @mull end; end; procedure LintSub(var p1, p2: Lint); var result : longint; carry : word; begin result := p1.a; dec(result, p2.a); if result < 0 then begin carry := 1; inc(result, 65536); end else carry := 0; p1.a := result; result := p1.b; dec(result, carry); dec(result, p2.b); if result < 0 then begin carry := 1; inc(result, 65536); end else carry := 0; p1.b := result; result := p1.c; dec(result, carry); dec(result, p2.c); if result < 0 then begin carry := 1; inc(result, 65536); end else carry := 0; p1.c := result; dec(p1.d, carry); dec(p1.d, p2.d); end; procedure InitRandomGenerator(InitValue : longint); begin with yWertZufall do begin b := InitWert div 65536; a := InitWert - b*65536; c := 0; d := 0; end; end; (* InitRandomGenerator *) function Random:real; var Wert : longint; begin LintMul(yWertZufall , Faktor); if yWertZufall.b >32767 then LintSub(yWertZufall,Modul); Wert := 2*yWertZufall.c + 65536*yWertZufall.b+yWertZufall.a; with yWertZufall do begin d := 0; c := 0; b := Wert shr 16; a := Wert - (b*65536); end; Zufall := Wert / 2147483647; end; (* Zufall *) begin with yWertZufall do begin a := 0; b := 0; c := 0; d := 0; end; Faktor := 16807; with Modul do begin a := 65535; b := 32767; c := 0; d := 0; end; end. (* _Zufall *)