Login
7 branches 0 tags
Ben (X13/Arch) Moved module tests into testsuite 048990d 2 years ago 1147 Commits
nujel / stdlib_modules / random.nuj
;;; 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 (* (ref self :seed) 1103515245)))
        (bit-or (bit-shift-left (bit-and (ref self :seed) #xFFFF) 16)
                (bit-and (bit-shift-right (ref 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))))