+(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:
;;;
;;; The state is stored in a (simple-array (unsigned-byte 32) (627))
;;; wrapped in a random-state structure:
;;;
- (/show0 "entering COPY-RANDOM-STATE")
- (let ((state (random-state-state state))
- (new-state
- (make-array 627 :element-type '(unsigned-byte 32))))
- (/show0 "made NEW-STATE, about to DOTIMES")
- (dotimes (i 627)
- (setf (aref new-state i) (aref state i)))
- (/show0 "falling through to %MAKE-RANDOM-STATE")
- (%make-random-state :state new-state))))
+ (/show0 "entering COPY-RANDOM-STATE")
+ (let ((state (random-state-state state))
+ (new-state
+ (make-array 627 :element-type '(unsigned-byte 32))))
+ (/show0 "made NEW-STATE, about to DOTIMES")
+ (dotimes (i 627)
+ (setf (aref new-state i) (aref state i)))
+ (/show0 "falling through to %MAKE-RANDOM-STATE")
+ (%make-random-state :state new-state))))
(values))
#!-x86
(defun random-chunk (state)
(declare (type random-state state))
(let* ((state (random-state-state state))
(values))
#!-x86
(defun random-chunk (state)
(declare (type random-state state))
(let* ((state (random-state-state state))
(defun random-chunk (state)
(declare (type random-state state))
(sb!vm::random-mt19937 (random-state-state state)))
(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
\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
;;; we have a hidden bit.
#!-sb-fluid (declaim (inline %random-single-float %random-double-float))
(declaim (ftype (function ((single-float (0f0)) random-state)
;;; we have a hidden bit.
#!-sb-fluid (declaim (inline %random-single-float %random-double-float))
(declaim (ftype (function ((single-float (0f0)) random-state)
- (dpb (ash (random-chunk state)
- (- sb!vm:single-float-digits random-chunk-length))
- sb!vm:single-float-significand-byte
- (single-float-bits 1.0)))
- 1.0)))
+ (dpb (ash (random-chunk state)
+ (- sb!vm:single-float-digits random-chunk-length))
+ sb!vm:single-float-significand-byte
+ (single-float-bits 1.0)))
+ 1.0)))
(* (float (random-chunk state) 1d0) (/ 1d0 (expt 2 32))))
;;; 53-bit version
#!-x86
(defun %random-double-float (arg state)
(declare (type (double-float (0d0)) arg)
(* (float (random-chunk state) 1d0) (/ 1d0 (expt 2 32))))
;;; 53-bit version
#!-x86
(defun %random-double-float (arg state)
(declare (type (double-float (0d0)) arg)
- (dpb (ash (random-chunk state)
- (- sb!vm:double-float-digits random-chunk-length
- sb!vm:n-word-bits))
- sb!vm:double-float-significand-byte
- (sb!impl::double-float-high-bits 1d0))
- (random-chunk state))
- 1d0)))
+ (dpb (ash (random-chunk state)
+ (- 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))
+ 1d0)))
;;; using a faster inline VOP
#!+x86
(defun %random-double-float (arg state)
(declare (type (double-float (0d0)) arg)
;;; using a faster inline VOP
#!+x86
(defun %random-double-float (arg state)
(declare (type (double-float (0d0)) arg)
- (dpb (ash (sb!vm::random-mt19937 state-vector)
- (- sb!vm:double-float-digits random-chunk-length
- sb!vm:n-word-bits))
- sb!vm:double-float-significand-byte
- (sb!impl::double-float-high-bits 1d0))
- (sb!vm::random-mt19937 state-vector))
- 1d0))))
+ (dpb (ash (sb!vm::random-mt19937 state-vector)
+ (- sb!vm:double-float-digits random-chunk-length
+ sb!vm:n-word-bits))
+ sb!vm:double-float-significand-byte
+ (sb!impl::double-float-high-bits 1d0))
+ (sb!vm::random-mt19937 state-vector))
+ 1d0))))
(declare (type (integer 1) arg) (type random-state state))
(let ((shift (- random-chunk-length random-integer-overlap)))
(do ((bits (random-chunk state)
(declare (type (integer 1) arg) (type random-state state))
(let ((shift (- random-chunk-length random-integer-overlap)))
(do ((bits (random-chunk state)
- (logxor (ash bits shift) (random-chunk state)))
- (count (+ (integer-length arg)
- (- random-integer-extra-bits shift))
- (- count shift)))
- ((minusp count)
- (rem bits arg))
+ (logxor (ash bits shift) (random-chunk state)))
+ (count (+ (integer-length arg)
+ (- random-integer-extra-bits shift))
+ (- count shift)))
+ ((minusp count)
+ (rem bits arg))
(declare (fixnum count)))))
(defun random (arg &optional (state *random-state*))
(declare (inline %random-single-float %random-double-float
(declare (fixnum count)))))
(defun random (arg &optional (state *random-state*))
(declare (inline %random-single-float %random-double-float
- :expected-type '(or (integer 1) (float (0))) :datum arg
- :format-control "~@<Argument is neither a positive integer nor a ~
+ :expected-type '(or (integer 1) (float (0))) :datum arg
+ :format-control "~@<Argument is neither a positive integer nor a ~