1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types alien.data kernel
4 math math.bitwise random sequences sequences.private
6 SPECIALIZED-ARRAY: uint
9 ! Multiply-with-carry RNG
20 TUPLE: cmwc-seed { Q uint-array read-only } { c read-only } ;
22 : <cmwc> ( length a b c -- cmwc )
27 swap [ 1 - >>i ] [ uint <c-array> >>Q ] bi
29 dup Q>> length 1 - >>mod ; inline
31 : <cmwc-seed> ( Q c -- cmwc-seed )
32 cmwc-seed boa ; inline
36 [ Q>> length 1 - >>i ]
39 M:: cmwc random-32* ( cmwc -- n )
40 cmwc dup mod>> '[ 1 + _ bitand ] change-i
42 [ [ i>> ] [ Q>> ] bi nth-unsafe * ]
45 [ >fixnum -32 shift cmwc c<< ]
46 [ cmwc [ b>> bitand ] [ c>> w+ ] bi ] bi
49 cmwc [ 1 + ] change-c drop
53 cmwc swap '[ r>> _ w- dup ] [ i>> ] [ Q>> ] tri set-nth-unsafe ;
55 : cmwc-4096 ( -- cmwc )
57 [ 18782 4294967295 362436 <cmwc> ]
59 '[ [ random-32 ] uint-array{ } replicate-as ] with-system-random
60 362436 <cmwc-seed> seed-random
63 : default-cmwc ( -- cmwc ) cmwc-4096 ;