1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types arrays fry kernel locals math
4 math.bitwise random sequences sequences.private
5 specialized-arrays specialized-arrays.instances.uint ;
8 ! Multiply-with-carry RNG
19 TUPLE: cmwc-seed { Q uint-array read-only } { c read-only } ;
21 : <cmwc> ( length a b c -- cmwc )
26 swap [ 1 - >>i ] [ <uint-array> >>Q ] bi
28 dup Q>> length 1 - >>mod ; inline
30 : <cmwc-seed> ( Q c -- cmwc-seed )
31 cmwc-seed boa ; inline
35 [ Q>> length 1 - >>i ]
38 M:: cmwc random-32* ( cmwc -- n )
39 cmwc dup mod>> '[ 1 + _ bitand ] change-i
41 [ [ i>> ] [ Q>> ] bi nth-unsafe * ]
44 [ >fixnum -32 shift cmwc (>>c) ]
45 [ cmwc [ b>> bitand ] [ c>> + ] bi 32 bits ] bi
48 cmwc [ 1 + ] change-c drop
52 cmwc swap '[ r>> _ - 32 bits dup ] [ i>> ] [ Q>> ] tri set-nth-unsafe ;
54 : cmwc-4096 ( -- cmwc )
56 [ 18782 4294967295 362436 <cmwc> ]
58 '[ [ random-32 ] uint-array{ } replicate-as ] with-system-random
59 362436 <cmwc-seed> seed-random
62 : default-cmwc ( -- cmwc ) cmwc-4096 ;