scheme(gauche)でxorshift乱数

SICP 3.1.2節のために。

(define (shift-32bit n count)
  (logand (ash n count) #xFFFFFFFF))

(define (make-xorshift-rand x y z w)
  (lambda()
    (let ((t (logxor x (shift-32bit x 11))))
	  (begin (set! x y)
		 (set! y z)
		 (set! z w)
		 (set! w (logxor (logxor w (shift-32bit w -19)) 
		                 (logxor t (shift-32bit t -8))))))))

(define xorshift-rand (make-xorshift-rand 123456789 
		                          362436069 
		                          521288629 
		                          88675123))
;;10回呼び出して表示
((lambda (max)
  (define (iter counter max)
    (if (< counter max)
	(begin (print (xorshift-rand))
	       (iter (+ counter 1) max))
	#t))
  (iter 0 max)) 10)