X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Frandom.lisp;h=373a3b2e5b3c203f15b06f27629aa79c5756c6a6;hb=95591ed483dbb8c0846c129953acac1554f28809;hp=4836a73b43b6c353a05c5f509a1d4d67e64522a3;hpb=0a7604d54581d2c846838c26ce6a7993629586fa;p=sbcl.git diff --git a/src/code/random.lisp b/src/code/random.lisp index 4836a73..373a3b2 100644 --- a/src/code/random.lisp +++ b/src/code/random.lisp @@ -9,15 +9,21 @@ (in-package "SB!KERNEL") -;;; the size of the chunks returned from the fundamental random number -;;; generator -(def!constant n-random-chunk-bits 32) -(def!constant most-positive-random-chunk - (1- (ash 1 n-random-chunk-bits))) +;;; the size of the chunks returned by RANDOM-CHUNK +(def!constant random-chunk-length 32) + +;;; the amount that we overlap chunks by when building a large integer +;;; to make up for the loss of randomness in the low bits +(def!constant random-integer-overlap 3) + +;;; extra bits of randomness that we generate before taking the value MOD the +;;; limit, to avoid loss of randomness near the limit +(def!constant random-integer-extra-bits 10) + +;;; the largest fixnum we can compute from one chunk of bits +(def!constant random-fixnum-max + (1- (ash 1 (- random-chunk-length random-integer-extra-bits)))) -;;; our implementation of the RANDOM-STATE type specified by ANSI CL (sb!xc:defstruct (random-state (:constructor %make-random-state) - ;; Shallow copy would be wrong: we must - ;; effectively COPY-SEQ the STATE slot. - (:copier nil)) + (:copier nil)) ; since shallow copy is wrong (state (init-random-state) :type (simple-array (unsigned-byte 32) (627))))