Contributor: FLOOR NAAIJKENS 
==============================================================================
 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)
 

AltStyle によって変換されたページ (->オリジナル) /