diff --git a/collects/srfi/27/random-bits.ss b/collects/srfi/27/random-bits.ss index 20ff97ad4e..1f68ea647e 100644 --- a/collects/srfi/27/random-bits.ss +++ b/collects/srfi/27/random-bits.ss @@ -11,34 +11,19 @@ random-source-randomize! random-source-pseudo-randomize!) - (define positive-integer/c - (and/c integer? positive? exact?)) + (define integer/c + (and/c integer? exact? positive?)) (define-struct random-source (generator)) - (provide/contract - (random-integer (-> random-source? any)) - (random-source-make-integers (-> random-source? any)) - (random-source-make-reals (case-> (-> random-source? any) - (-> random-source? (and/c (>/c 0) ( integer/c any)) + (random-source-make-integers + (-> random-source? (-> integer/c any))) + (random-source-make-reals + (case-> + (-> random-source? any) + (-> random-source? (and/c (>/c 0) (vector (random-source-generator s))) - (define-syntax random-source-state-set! - (syntax-rules (default-random-source) - ((_ default-random-source state) - (current-pseudo-random-generator (vector->pseudo-random-generator state))) - ((_ s state) - (set-random-source-generator! s - (vector->pseudo-random-generator state))))) + (define (random-source-state-set! s state) + (set-random-source-generator! s (vector->pseudo-random-generator state))) - (define-syntax random-source-randomize! - (syntax-rules (default-random-source) - ((_ default-random-source) - (current-pseudo-random-generator (make-pseudo-random-generator))) - ((_ s) - (set-random-source-generator! s - (make-pseudo-random-generator))))) + (define (random-source-randomize! s) + (set-random-source-generator! s (make-pseudo-random-generator))) - (define-syntax random-source-pseudo-randomize! - (syntax-rules (default-random-source) - ((_ default-random-source ij ...) - (random-seed (modulo (equal-hash-code (list ij ...)) 2147483648))) - ((_ s ij ...) - (parameterize ((current-pseudo-random-generator - (random-source-generator s))) - (random-seed (modulo (equal-hash-code (list ij ...)) 2147483648)))))) + (define (random-source-pseudo-randomize! s . ij) + (parameterize ((current-pseudo-random-generator + (random-source-generator s))) + (random-seed (modulo (equal-hash-code ij) 2147483648)))) + + (define (my-random-integer n) + (if (<= n 2147483647) + (random n) + (+ (* (my-random-integer (quotient n 1073741824)) 1073741824) + (random 1073741824)))) (define (random-source-make-integers s) (lambda (n) (parameterize ((current-pseudo-random-generator (random-source-generator s))) - (random-integer n)))) + (my-random-integer n)))) (define random-source-make-reals (case-lambda @@ -94,6 +84,11 @@ (lambda () (parameterize ((current-pseudo-random-generator (random-source-generator s))) - (* (add1 (random n)) unit))))))) + (* (add1 (my-random-integer n)) unit))))))) - (random-seed 0)) + (define random-integer + (random-source-make-integers my-default-random-source)) + + (define random-real + (random-source-make-reals my-default-random-source)) + )