factor/extra/random/cmwc/cmwc.factor

64 lines
1.5 KiB
Factor
Raw Normal View History

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-ARRAY: 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 }
2009-10-17 01:09:01 -04:00
{ a integer }
{ b integer }
{ c integer }
{ i integer }
{ r integer }
2009-10-16 16:07:05 -04:00
{ 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-16 16:53:45 -04:00
[ c>> + ] tri
2009-10-07 21:06:39 -04:00
[ >fixnum -32 shift cmwc c<< ]
2009-10-16 16:53:45 -04:00
[ cmwc [ b>> bitand ] [ c>> + ] bi 32 bits ] bi
2009-10-16 16:53:45 -04:00
dup cmwc r>> > [
2009-10-07 21:06:39 -04:00
cmwc [ 1 + ] change-c drop
2009-10-16 16:53:45 -04:00
cmwc b>> - 32 bits
2009-10-07 21:06:39 -04:00
] when
2009-10-16 16:53:45 -04:00
cmwc swap '[ r>> _ - 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 ;