(define random (let ((seed 1) (a (+ (* 3141 1000 1000) (* 592 1000) 621)) (m (expt 2 63)) (c 1)) (lambda (k) (if (not (integer? k)) (error "RANDOM is valid only for integers %a" k)) (if (not (and (positive? k) (<= k m))) (error "RANDOM is valid only for integers from 1 to %a" m)) (set! seed (remainder (+ (* a seed) c) m)) (quotient (* seed k) m))))