| 
									
										
										
										
											2009-10-07 21:06:39 -04:00
										 |  |  | ! Copyright (C) 2009 Doug Coleman. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2011-09-25 14:49:27 -04:00
										 |  |  | USING: accessors alien.c-types alien.data arrays fry kernel | 
					
						
							|  |  |  | locals math math.bitwise random sequences sequences.private | 
					
						
							| 
									
										
										
										
											2009-10-19 05:41:53 -04:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2011-09-25 14:49:27 -04:00
										 |  |  |         swap [ 1 - >>i ] [ uint <c-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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-05 16:52:54 -04:00
										 |  |  |     [ >fixnum -32 shift cmwc c<< ] | 
					
						
							| 
									
										
										
										
											2014-02-25 18:59:51 -05:00
										 |  |  |     [ cmwc [ b>> bitand ] [ c>> w+ ] bi ] bi
 | 
					
						
							| 
									
										
										
										
											2009-10-16 17:08:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-16 16:53:45 -04:00
										 |  |  |     dup cmwc r>> > [ | 
					
						
							| 
									
										
										
										
											2009-10-07 21:06:39 -04:00
										 |  |  |         cmwc [ 1 + ] change-c drop
 | 
					
						
							| 
									
										
										
										
											2014-02-25 18:59:51 -05:00
										 |  |  |         cmwc b>> w- | 
					
						
							| 
									
										
										
										
											2009-10-07 21:06:39 -04:00
										 |  |  |     ] when
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 18:59:51 -05:00
										 |  |  |     cmwc swap '[ r>> _ w- 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 ;
 |