[Back to MISC SWAG index] [Back to Main SWAG index] [Original]
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 *)
[Back to MISC SWAG index] [Back to Main SWAG index] [Original]