[Back to MISC SWAG index] [Back to Main SWAG index] [Original]
==============================================================================
BBS: The Sand Box BBS - SourceNet Central HUB
To: JUD MCCRANIE Date: 12-17Ä92 (16:42)
From: TREVOR CARLSEN Number: 531 [87] FD-Pascal
Subj: BP 7 DIFFERENCE Status: Public
------------------------------------------------------------------------------
JM> The behavior of RANDOM (with RandSeed set) is different in
JM> BP7 (and presumably TP7) from that in TP 5.5. (I don't know
JM> how TP 6 compares since I burned it off my disk).
JM> RandSeed := 123;
JM> for i := 1 to 8 do writeln( random( 1000));
JM> TP 5.5: 343 282 986 996 781 855 343 32
JM> BP 7.0: 859 80 869 854 317 257 20 46
JM> ...both are consistant, but they are different sequences.
JM> This can have some dire consequences. ...
It certainly could if you did not know about it and unfortunately I can
find no reference to the changes in the documentation. (Richard Nelson?)
Here is a fix (supplied to me via Netmail courtesy Joe Lamoine - thanks Joe).
>Quote........
I posted a message on Compuserve last nite and got the following
unit in a response. It seems to work fine!
{ * Turbo Pascal Runtime Library Version 6.0 * ;
* Random Number Generator * ;
* * ;
* Copyright (C) 1988,92 Borland International * }
unit TP6Rand;
interface
function Random(Max: Integer): Integer;
implementation
const
{ Scaling constant}
ConstM31 = Longint(-31);
{ Multiplication factor}
Factor: Word = $8405;
function NextRand: Longint; assembler;
{ Compute next random number
New := 8088405H * Old + 1
Out DX:AX = Next random number
}
asm
MOV AX,RandSeed.Word[0]
MOV BX,RandSeed.Word[2]
MOV CX,AX
MUL Factor.Word[0] { New = Old.w0 * 8405H }
SHL CX,1 { New.w2 += Old.w0 * 808H }
SHL CX,1
SHL CX,1
ADD CH,CL
ADD DX,CX
ADD DX,BX { New.w2 += Old.w2 * 8405H }
SHL BX,1
SHL BX,1
ADD DX,BX
ADD DH,BL
MOV CL,5
SHL BX,CL
ADD DH,BL
ADD AX,1 { New += 1 }
ADC DX,0
MOV RandSeed.Word[0],AX
MOV RandSeed.Word[2],DX
end;
function Random(Max: Integer): Integer; assembler;
asm
CALL NextRand
XOR AX,AX
MOV BX,Max.Word[0]
OR BX,BX
JE @@1
XCHG AX,DX
DIV BX
XCHG AX,DX
@@1:
end;
end.
>End of quote.
TeeCee
--- TC-ED v2.01
* Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
[Back to MISC SWAG index] [Back to Main SWAG index] [Original]