application/octet-stream
•
1.36 KB
•
33 lines
;;; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
;;; This project uses the MIT license, a copy should be included under /LICENSE
;;;
;;; A very simple pseudo random number generator, suitable for the illusion of
;;; randomness
(defclass rng
"A simple RNG"
:export
(defn new (self seed)
(when-not seed (set! seed (bit-xor (time) (time/milliseconds))))
{ :seed seed :prototype* self })
(defn seed! (self seed)
"Set a new seed value for the RNG"
(set! self.seed seed))
(defn rng! (self)
"Generate a random integer"
(set! self.seed (+ 12345 (* self.seed 1103515245)))
(bit-or (bit-shift-left (bit-and self.seed #xFFFF) 16)
(bit-and (bit-shift-right self.seed 16) #xFFFF)))
(defn int (self max)
"Return a value from 0 to MAX, or, if left out, a random int"
(if max (rem (abs (:rng! self)) max) (:rng! self))))
(deftest #t (int? (:int (:new random/rng))))
(deftest #t (def r (:new random/rng)) (:seed! r 123) (def first-value (:int r)) (:seed! r 123) (= first-value (:int r)))
(deftest #t (def r (:new random/rng)) (:seed! r 99) (not= (:int r) (:int r)))
(deftest #t (int? (-> (:new random/rng) :int)))
(deftest #t (def rng (:new random/rng 123)) (def a (:int rng)) (:seed! rng 123) (= (:int rng) a))
(deftest #t (def rng (:new random/rng 99)) (not= (:int rng) (:int rng)))