! Copyright (C) 2005, 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. ! mersenne twister based on ! http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c USING: arrays kernel math namespaces sequences system init accessors math.ranges random circular math.bitwise combinators ; IN: random.mersenne-twister > [ [ (mt-generate) ] [ set-nth ] 2bi ] curry each ] [ 0 >>i drop ] bi ; : init-mt-formula ( i seq -- f(seq[i]) ) dupd nth dup -30 shift bitxor 1812433253 * + 1+ 32 bits ; : init-mt-rest ( seq -- ) mt-n 1- swap [ [ init-mt-formula ] [ >r 1+ r> set-nth ] 2bi ] curry each ; : init-mt-seq ( seed -- seq ) 32 bits mt-n 0 [ set-first ] [ init-mt-rest ] [ ] tri ; : mt-temper ( y -- yt ) dup -11 shift bitxor dup 7 shift HEX: 9d2c5680 bitand bitxor dup 15 shift HEX: efc60000 bitand bitxor dup -18 shift bitxor ; inline : next-index ( mt -- i ) dup i>> dup mt-n < [ nip ] [ drop mt-generate 0 ] if ; PRIVATE> : ( seed -- obj ) init-mt-seq 0 mersenne-twister boa dup mt-generate ; M: mersenne-twister seed-random ( mt seed -- ) init-mt-seq >>seq drop ; M: mersenne-twister random-32* ( mt -- r ) [ next-index ] [ seq>> nth mt-temper ] [ [ 1+ ] change-i drop ] tri ;