]> gitweb.factorcode.org Git - factor.git/commitdiff
random: performance improvements to random-integer and random-bits.
authorJohn Benediktsson <mrjbq7@gmail.com>
Wed, 27 Feb 2013 22:05:46 +0000 (14:05 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 27 Feb 2013 22:05:46 +0000 (14:05 -0800)
basis/random/random.factor

index 5571fccd3d791184d6b50430c572619a0a967588..7d2bfc55a86b7791f3904d9ef1c16e875809b7e2 100644 (file)
@@ -46,21 +46,24 @@ TYPED: random-bytes ( n: fixnum -- byte-array: byte-array )
 
 <PRIVATE
 
-:: ((random-integer)) ( bits obj -- n required-bits )
+: #bits ( n -- bits )
+    dup 2 <= [ drop 1 ] [ 1 - log2 1 + ] if ; inline
+
+:: (random-bits) ( n bits obj -- n' )
     obj random-32* 32 bits 32 - [ dup 0 > ] [
         [ 32 shift obj random-32* + ] [ 32 + ] [ 32 - ] tri*
-    ] while drop ;
+    ] while drop [ n * ] [ 2^ /i ] bi* ; inline
 
 : (random-integer) ( n obj -- n' )
-    [ dup next-power-of-2 log2 ] dip ((random-integer))
-    [ * ] [ 2^ /i ] bi* ;
+    [ dup #bits ] dip (random-bits) ;
 
 : random-integer ( n -- n' )
     random-generator get (random-integer) ;
 
 PRIVATE>
 
-: random-bits ( numbits -- r ) 2^ random-integer ;
+: random-bits ( numbits -- r )
+    [ 2^ ] keep random-generator get (random-bits) ;
 
 : random-bits* ( numbits -- n )
     1 - [ random-bits ] keep set-bit ;