Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-09-20

KMRCLを眺める(205) SEED-RANDOM-GENERATOR

| 23:05 | KMRCLを眺める(205) SEED-RANDOM-GENERATOR - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(205) SEED-RANDOM-GENERATOR - わだばLisperになる

equal.lispも眺め終えたので、今回は、KMRCLのrandom.lispからSEED-RANDOM-GENERATORです。

定義は、

(defun seed-random-generator ()
  "Evaluate a random number of items"
  (let ((randfile (make-pathname
                   :directory '(:absolute "dev")
                   :name "urandom")))
    (setf *random-state* (make-random-state t))
    (if (probe-file randfile)
        (with-open-file
            (rfs randfile :element-type 'unsigned-byte)
          (let*
              ;; ((seed (char-code (read-char rfs))))
              ((seed (read-byte rfs)))
            ;;(format t "Randomizing!~%")
            (loop
                for item from 1 to seed
                do (loop
                       for it from 0 to (+ (read-byte rfs) 5)
                       do (random 65536))))))))

となっています。

/dev/urandomから1バイト読み出して得た0〜255の数値の回数(内側は+5)でループを回してRANDOMを実行し乱数の種を変化させるもののようです。

実行例は、

(SEED-RANDOM-GENERATOR)
;⇒ NIL

ですが、副作用目的になります。