(define (make-random state) (define a 16807) (define m 2147483647) (define (generate) (set! state (remainder (* a state) m)) state) (define (reset value) (set! state value)) (define (dispatch m) (cond ((eq? m 'generate) (generate)) ((eq? m 'reset) reset) (else (error "Unknown request -- MAKE-RANDOM" m)))) dispatch) (define rand (make-random 42)) ; Algorithm: ; a = 16807 ; m = 2147483647 ; seed = (a * seed) mod m ; random = seed / m ; for random floats ; 1 ]=> (rand 'generate) ; ; ;Value: 705894 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 1126542223 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 1579310009 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 565444343 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 807934826 ; ; 1 ]=> ((rand 'reset) 42) ; ; ;Value: 807934826 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 705894 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 1126542223 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 1579310009 ; ; 1 ]=> ((rand 'reset) 123) ; ; ;Value: 1579310009 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 2067261 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 384717275 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 2017463455 ; ; 1 ]=> ((rand 'reset) 123) ; ; ;Value: 2017463455 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 2067261 ; ; 1 ]=> (rand 'generate) ; ; ;Value: 384717275