[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gforth] Random number generator

From: mhx
Subject: [gforth] Random number generator
Date: Thu, 10 Aug 2017 20:16:26 +0200
User-agent: Roundcube Webmail/1.2.4

Hi James,

I had to think a bit about this.

My false assumption was that the return from rnd
is always equal to (rnd) (i.e. assuming a shift
register based LCG). In that case I deduced that
when n is stored in (rnd), and after this a sequence
n1,...nk n is returned by rnd, the generator length
is k.

How embarrasing!

At least the futile computations gave me a number
that makes it trivial to find the real generator


-- ------------------------
variable (rnd)

: rnd ( -- n )
          (rnd) 32B@
          dup #13   lshift xor $FFFFFFFF and
          dup #17   rshift xor $FFFFFFFF and
          dup DUP 5 lshift xor (rnd) 32B! ;

-- A good seed to start is 1073741825, because it
-- starts a sequence with the number 1073741825. Therefore
-- we skip this first returned number and test until
-- 1073741825 is returned again.

: xtest ( -- )
        CR ." Searching for the generator cycle ... cycle = "
          #1073741825 (rnd) ! rnd ( 1073741825) DROP
          0 BEGIN  rnd #1073741825 <>  WHILE  1+  REPEAT
        CR .ELAPSED ;

\ FORTH> xtest
\ Searching for the generator cycle ... cycle = 4294967294
\ 47.466 seconds elapsed. ok
\ FORTH> 4294967294 H. $FFFFFFFE ok

reply via email to

[Prev in Thread] Current Thread [Next in Thread]