gforth
[Top][All Lists]
Advanced

[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
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

```

reply via email to

 [Prev in Thread] Current Thread [Next in Thread]
• [gforth] Random number generator, mhx <=