Random number generator

[email protected]
Newsgroups gmane.comp.lang.forth.gforth
Message-ID <[email protected]>
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
length.

-marcel

-- ------------------------
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 = "
	TIMER-RESET
           #1073741825 (rnd) ! rnd ( 1073741825) DROP
           0 BEGIN  rnd #1073741825 <>  WHILE  1+  REPEAT
   	  U.
	CR .ELAPSED ;

\ FORTH> xtest
\ Searching for the generator cycle ... cycle = 4294967294
\ 47.466 seconds elapsed. ok
\ FORTH> 4294967294 H. $FFFFFFFE ok
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.