I didn't find anything in SwiftForth and Vfx. The below is cute, but
rather pointless as such (by Wil Baden or Neil Bawd?).
-marcel
-- --------------
ANEW -rt
NEEDS -ran-next
\ *******************************************************************
\ * *
\ * Linear Congruential Sequence *
\ * *
\ * A linear congruential sequence (LCS) depends on four magic *
\ * numbers: X[0], M, A, and C. *
\ * *
\ * 0 VALUE X[i] X[0] TO X[i] *
\ * : RAND ( -- u ) X[i] A * C + M MOD dup TO X[i] ; *
\ * *
\ *******************************************************************
\ *********** Assorted Simple Random Number Generators ************
0 VALUE SEEDi
0 VALUE X[i]
0 VALUE Y[i]
: RANDOM-std ( -- u ) X[i] $107465 * $234567 + dup TO X[i] ;
: RANDOM2P ( -- u )
RANDOM-std #255 AND #24 LSHIFT
RANDOM-std #255 AND #16 LSHIFT OR
RANDOM-std #255 AND 8 LSHIFT OR
RANDOM-std #255 AND OR ;
: Random-Aphwb ( -- u ) X[i] #69069 * 1+ dup TO X[i] ;
\ Estimated cycle: about 74 quadrillion.
: Rand-Next2
( -- 1..2147483647 )
X[i]
#48271 #2147483647 */MOD DROP
dup TO X[i]
Y[i]
#40692 #2147483399 */MOD DROP
dup TO Y[i]
- dup 0> NOT IF #
2147483647 + ENDIF ;
\ **************************** Timing *****************************
VARIABLE TOOL TOOL OFF SAVE-INPUT TOOL @ [IF]
#1000000000 to #TIMES
\ ?Forth iForth; Athlon
SEEDi TO X[i] [TIME Random-Aphwb DROP TIME] \ 5 secs 1.8 secs
SEEDi TO X[i] [TIME RANDOM-std DROP TIME] \ 5 secs 1.6 secs
SEEDi TO X[i] [TIME RANDOM2P DROP TIME] \ 31 secs 5.6 secs
SEEDi TO X[i] 1 TO Y[I] [TIME Rand-Next2 DROP TIME] \ 66 secs 13.8 secs
SEEDi Ran-Start [TIME Ran-Next DROP TIME] \ 99 secs 22.9 secs
[ELSE]
: ANNOUNCE >IN @ >R BL <WORD> CR TYPE Tab EMIT R> >IN ! ;
: :GO S" MARKER NONCE : (GO) " EVALUATE ; IMMEDIATE
: GO S" (GO) NONCE " EVALUATE ; IMMEDIATE
: ;SEE S" ; SEE (GO) NONCE " EVALUATE ; IMMEDIATE
: [TIME ANNOUNCE S" :GO TIMER-RESET #TIMES 0 DO " EVALUATE ; IMMEDIATE
: TIME] S" LOOP .ELAPSED ; GO " EVALUATE ; IMMEDIATE
#1000000000 VALUE #TIMES
TOOL ON RESTORE-INPUT .S .( never get here )
[THEN]
DROP
\ EOF
FORTH> in
Removing --- Ran-Next RNG Version 1.02 ---
Creating --- Ran-Next RNG Version 1.02 ---
Random-Aphwb 2.250 seconds elapsed.
RANDOM-std 2.230 seconds elapsed.
RANDOM2P 9.220 seconds elapsed.
Rand-Next2 3.478 seconds elapsed.
Ran-Next 5.937 seconds elapsed. ok