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