gforth
[Top][All Lists]

## Re: [gforth] Marcel's Random-Function

 From: James Gere Subject: Re: [gforth] Marcel's Random-Function Date: Sun, 13 Aug 2017 19:33:23 -0400

Hi, Marcel,
as a first installment on earlier promises, here are the inverse functions as GForth code:

include random.fs \ need 'rnd' for test

variable (rnd)    \ for marcel's rnd

\ note:  for "dup shift xor," all the inverse functions

:  turn-around ( n -- n' )   dup 5 lshift xor ;
: -turn-around ( n -- n' )   turn-around
dup 10 lshift xor  dup 20 lshift xor ;

:  take-off2nd ( n -- n' )   dup 17 rshift xor ;
: -take-off2nd ( n -- n' )   take-off2nd ;

:  take-off1st ( n -- n' )   dup 13 lshift xor ;
: -take-off1st ( n -- n' )   take-off1st       dup 26 lshift xor ;

\ note: here we reverse order for inverses because
\ the lshifts and rshift don't commute
:  take-off    ( n -- n' )    take-off1st  take-off2nd ;
: -take-off    ( n -- n' )   -take-off2nd -take-off1st ;

:  marcel ( -- n )   (rnd) @  take-off    dup  turn-around  (rnd) ! ;
: -marcel ( -- n )   (rnd) @ -turn-around dup -take-off     (rnd) ! ;

: tst   begin  cr rnd ( <-<< time based random number ) dup .
(rnd) !  marcel dup .  -take-off . -marcel .
\ the check is 1st# = 3rd#  and  2nd# = 4th#
key 10 = until ;