[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]