\ -*- mode: forth -*-
\ $Id: random.bigforth,v 1.1 2001/06/20 23:23:29 doug Exp $
\ http://www.bagley.org/~doug/shootout/
\ based on code from Marcel Hendrix

\needs float  import float  float also

\ read NUM from last command line argument
0. argc @ 1- arg >number 2drop drop constant NUM

 139968     CONSTANT IM 
   3877     CONSTANT IA
  29573     CONSTANT IC
IM S>D D>F 
1e FSWAP F/ FCONSTANT FIM 
     42     VALUE seed

: format-float  ff$ type ;

: IM_mod  
    S" DUP $001DF757 UM* NIP  $FFFFFFC0 AND  2187 *  - " 
    EVALUATE ; IMMEDIATE

: gen_random  
    S" seed IA *  IC +  IM_mod  DUP TO seed 0 D>F " EVALUATE
     S" FIM F* F* " EVALUATE ; IMMEDIATE

: MAIN 
    NUM
    10 SET-PRECISION
    0e  BEGIN  ?DUP  
        WHILE  1- FDROP 100e0 gen_random  
        REPEAT
    format-float cr ;

MAIN 
bye