2009-10-07 21:06:39 -04:00
|
|
|
! Copyright (C) 2009 Doug Coleman.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-10-16 16:07:05 -04:00
|
|
|
USING: accessors alien.c-types arrays fry kernel locals math
|
2009-10-16 16:50:33 -04:00
|
|
|
math.bitwise random sequences sequences.private
|
|
|
|
specialized-arrays specialized-arrays.instances.uint ;
|
2009-10-07 21:06:39 -04:00
|
|
|
IN: random.cmwc
|
|
|
|
|
|
|
|
! Multiply-with-carry RNG
|
|
|
|
|
2009-10-16 16:07:05 -04:00
|
|
|
TUPLE: cmwc
|
|
|
|
{ Q uint-array }
|
|
|
|
{ a fixnum }
|
|
|
|
{ b fixnum }
|
|
|
|
{ c fixnum }
|
|
|
|
{ i fixnum }
|
|
|
|
{ r fixnum }
|
|
|
|
{ mod fixnum } ;
|
2009-10-07 21:06:39 -04:00
|
|
|
|
2009-10-16 16:07:05 -04:00
|
|
|
TUPLE: cmwc-seed { Q uint-array read-only } { c read-only } ;
|
2009-10-07 21:06:39 -04:00
|
|
|
|
|
|
|
: <cmwc> ( length a b c -- cmwc )
|
|
|
|
cmwc new
|
|
|
|
swap >>c
|
|
|
|
swap >>b
|
|
|
|
swap >>a
|
2009-10-16 16:07:05 -04:00
|
|
|
swap [ 1 - >>i ] [ <uint-array> >>Q ] bi
|
2009-10-07 21:06:39 -04:00
|
|
|
dup b>> 1 - >>r
|
2009-10-16 16:50:33 -04:00
|
|
|
dup Q>> length 1 - >>mod ; inline
|
2009-10-07 21:06:39 -04:00
|
|
|
|
2009-10-07 21:21:09 -04:00
|
|
|
: <cmwc-seed> ( Q c -- cmwc-seed )
|
2009-10-16 16:07:05 -04:00
|
|
|
cmwc-seed boa ; inline
|
2009-10-07 21:21:09 -04:00
|
|
|
|
2009-10-07 21:06:39 -04:00
|
|
|
M: cmwc seed-random
|
2009-10-07 21:21:09 -04:00
|
|
|
[ Q>> >>Q ]
|
|
|
|
[ Q>> length 1 - >>i ]
|
|
|
|
[ c>> >>c ] tri ;
|
2009-10-07 21:06:39 -04:00
|
|
|
|
|
|
|
M:: cmwc random-32* ( cmwc -- n )
|
|
|
|
cmwc dup mod>> '[ 1 + _ bitand ] change-i
|
|
|
|
[ a>> ]
|
2009-10-16 16:50:33 -04:00
|
|
|
[ [ i>> ] [ Q>> ] bi nth-unsafe * ]
|
2009-10-07 21:06:39 -04:00
|
|
|
[ c>> + ] tri :> t!
|
|
|
|
|
|
|
|
t -32 shift cmwc (>>c)
|
|
|
|
|
2009-10-16 16:19:30 -04:00
|
|
|
t cmwc [ b>> bitand ] [ c>> + ] bi 32 bits t!
|
2009-10-07 21:06:39 -04:00
|
|
|
t cmwc r>> > [
|
|
|
|
cmwc [ 1 + ] change-c drop
|
2009-10-16 16:19:30 -04:00
|
|
|
t cmwc b>> - 32 bits t!
|
2009-10-07 21:06:39 -04:00
|
|
|
] when
|
|
|
|
|
2009-10-16 16:50:33 -04:00
|
|
|
cmwc [ r>> t - 32 bits dup ] [ i>> ] [ Q>> ] tri set-nth-unsafe ;
|
2009-10-07 21:06:39 -04:00
|
|
|
|
|
|
|
: cmwc-4096 ( -- cmwc )
|
|
|
|
4096
|
|
|
|
[ 18782 4294967295 362436 <cmwc> ]
|
2009-10-07 21:25:00 -04:00
|
|
|
[
|
2009-10-16 16:07:05 -04:00
|
|
|
'[ [ random-32 ] uint-array{ } replicate-as ] with-system-random
|
2009-10-07 21:25:00 -04:00
|
|
|
362436 <cmwc-seed> seed-random
|
|
|
|
] bi ;
|
2009-10-16 16:07:05 -04:00
|
|
|
|
|
|
|
: default-cmwc ( -- cmwc ) cmwc-4096 ;
|