0.8.21.29:
[sbcl.git] / src / code / target-random.lisp
index aa87cad..3e35382 100644 (file)
 (def!method make-load-form ((random-state random-state) &optional environment) 
   (make-load-form-saving-slots random-state :environment environment))
 
+(def!method print-object ((state random-state) stream)
+  (if (and *print-readably* (not *read-eval*))
+      (error 'print-not-readable :object state)
+      (format stream "#S(~S ~S #.~S)"
+             'random-state
+             ':state
+             `(make-array 627 
+               :element-type 
+               '(unsigned-byte 32)
+               :initial-contents 
+               ',(coerce (random-state-state state) 'list)))))
+
 ;;; The state is stored in a (simple-array (unsigned-byte 32) (627))
 ;;; wrapped in a random-state structure:
 ;;;
 (defun random-chunk (state)
   (declare (type random-state state))
   (sb!vm::random-mt19937 (random-state-state state)))
+
+#!-sb-fluid (declaim (inline big-random-chunk))
+(defun big-random-chunk (state)
+  (declare (type random-state state))
+  (logand (1- (expt 2 64))
+         (logior (ash (random-chunk state) 32)
+                 (random-chunk state))))
 \f
 ;;; Handle the single or double float case of RANDOM. We generate a
 ;;; float between 0.0 and 1.0 by clobbering the significand of 1.0
   (* arg
      (- (sb!impl::make-double-float
         (dpb (ash (random-chunk state)
-                  (- sb!vm:double-float-digits random-chunk-length
-                     sb!vm:n-word-bits))
+                  (- sb!vm:double-float-digits random-chunk-length 32))
              sb!vm:double-float-significand-byte
              (sb!impl::double-float-high-bits 1d0))
         (random-chunk state))