疑似乱数を作ってみる

30分プログラム、その399。疑似乱数を作ってみる。
より正確には疑似乱数を計算する関数を返す関数を作った。疑似乱数の種を与えると、疑似乱数を計算する関数を返すやつ。
あと、ひとつ前の乱数を保存するために、ローカル変数とクロージャを組合せてみた。Closure is a poor man's object !

使い方

gosh> (define r (rand 673 944))
r
gosh> (r)
92
gosh> (r)
28
gosh> (r)
97
gosh> (r)
62
gosh> (r)
26
gosh> (r)
84

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; random.scm -
;;
;; Copyright(C) 2008 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2008/10/23 22:16:29
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(define (rand p q)
  (let1 a 42
    (lambda ()
      (let1 b (modulo (quotient (+ (* a p) q) 100) 100)
	(set! a b)
	b))))