TUPLE: random-dummy i ;
C: <random-dummy> random-dummy
-M: random-dummy seed-random ( seed obj -- )
- (>>i) ;
+M: random-dummy seed-random ( obj seed -- obj )
+ >>i ;
-M: random-dummy random-32* ( obj -- r )
+M: random-dummy random-32 ( obj -- r )
[ dup 1 + ] change-i drop ;
[ f ] [ 1234 [ randoms randoms = ] test-rng ] unit-test
[ 1333075495 ] [
- 0 [ 1000 [ drop random-generator get random-32* drop ] each random-generator get random-32* ] test-rng
+ 0 [ 1000 [ drop random-generator get random-32 drop ] each random-generator get random-32 ] test-rng
] unit-test
[ 1575309035 ] [
- 0 [ 10000 [ drop random-generator get random-32* drop ] each random-generator get random-32* ] test-rng
+ 0 [ 10000 [ drop random-generator get random-32 drop ] each random-generator get random-32 ] test-rng
] unit-test
[ 3 ] [ 101 [ 3 random-bytes length ] test-rng ] unit-test
[ 33 ] [ 101 [ 33 random-bytes length ] test-rng ] unit-test
[ t ] [ 101 [ 100 random-bits log2 90 > ] test-rng ] unit-test
+
+[ t ]
+[
+ 1234 <mersenne-twister>
+ [ random-32 ] [ 1234 seed-random random-32 ] bi =
+] unit-test
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 seed-random ( mt seed -- mt' )
+ init-mt-seq >>seq
+ [ mt-generate ]
+ [ 0 >>i drop ]
+ [ ] tri ;
-M: mersenne-twister random-32* ( mt -- r )
+M: mersenne-twister random-32 ( mt -- r )
[ next-index ]
[ seq>> nth-unsafe mt-temper ]
[ [ 1 + ] change-i drop ] tri ;
-[
+: default-mersenne-twister ( -- mersenne-twister )
[ 32 random-bits ] with-system-random
- <mersenne-twister> random-generator set-global
+ <mersenne-twister> ;
+
+[
+ default-mersenne-twister random-generator set-global
] "bootstrap.random" add-init-hook
IN: random
HELP: seed-random
-{ $values { "tuple" "a random number generator" } { "seed" "an integer between 0 and 2^32-1" } }
-{ $description "Seed the random number generator." }
+{ $values
+ { "tuple" "a random number generator" }
+ { "seed" "a seed specific to the random number generator" }
+ { "tuple'" "a random number generator" }
+}
+{ $description "Seed the random number generator. Repeatedly seeding the random number generator should provide the same sequence of random numbers." }
{ $notes "Not supported on all random number generators." } ;
-HELP: random-32*
+HELP: random-32
{ $values { "tuple" "a random number generator" } { "r" "an integer between 0 and 2^32-1" } }
{ $description "Generates a random 32-bit unsigned integer." } ;
ARTICLE: "random-protocol" "Random protocol"
"A random number generator must implement one of these two words:"
-{ $subsection random-32* }
+{ $subsection random-32 }
{ $subsection random-bytes* }
"Optional, to seed a random number generator:"
{ $subsection seed-random } ;
SYMBOL: secure-random-generator
SYMBOL: random-generator
-GENERIC: seed-random ( tuple seed -- )
-GENERIC: random-32* ( tuple -- r )
+GENERIC# seed-random 1 ( tuple seed -- tuple' )
+GENERIC: random-32 ( tuple -- r )
GENERIC: random-bytes* ( n tuple -- byte-array )
M: object random-bytes* ( n tuple -- byte-array )
[ [ <byte-vector> ] keep 4 /mod ] dip
- [ pick '[ _ random-32* 4 >le _ push-all ] times ]
+ [ pick '[ _ random-32 4 >le _ push-all ] times ]
[
over zero?
- [ 2drop ] [ random-32* 4 >le swap head over push-all ] if
+ [ 2drop ] [ random-32 4 >le swap head over push-all ] if
] bi-curry bi* ;
-M: object random-32* ( tuple -- r ) 4 random-bytes* le> ;
+M: object random-32 ( tuple -- r ) 4 random-bytes* le> ;
ERROR: no-random-number-generator ;
M: f random-bytes* ( n obj -- * ) no-random-number-generator ;
-M: f random-32* ( obj -- * ) no-random-number-generator ;
+M: f random-32 ( obj -- * ) no-random-number-generator ;
: random-bytes ( n -- byte-array )
random-generator get random-bytes* ;
IN: blum-blum-shub.tests
[ 887708070 ] [
- T{ blum-blum-shub f 590695557939 811977232793 } clone random-32*
+ T{ blum-blum-shub f 590695557939 811977232793 } clone random-32
] unit-test
[ 3716213681 ]
[
100 T{ blum-blum-shub f 200352954495 846054538649 } clone tuck [
- random-32* drop
+ random-32 drop
] curry times
- random-32*
+ random-32
] unit-test
[ find-relative-prime ] keep
blum-blum-shub boa ;
-M: blum-blum-shub random-32* ( bbs -- r )
+M: blum-blum-shub random-32 ( bbs -- r )
0 32 rot
[ next-bbs-bit swap 1 shift bitor ] curry times ;