Login
7 branches 0 tags
Benjamin Vincent Schulenburg Added a simple [file/copy] function ff9f1ed 3 years ago 869 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

[def seed 0]

[export rng!
        [defn random/rng! []
          [set! seed [+ 12345 [* seed 1103515245]]]
          [bit-or [bit-shift-left [bit-and seed #xFFFF] 16]
                  [bit-and [bit-shift-right seed 16] #xFFFF]]]]

[export seed!
        [defn random/seed! [new-seed]
          "Set a new seed value for the RNG"
          [set! seed new-seed]]]

[export seed
        [defn random/seed []
          "Return the current RNG seed value"
          [return seed]]]

[export int
        [defn random [max]
          "Return a value from 0 to MAX, or, if left out, a random int"
          [if max
              [rem [abs [random/rng!]] max]
              [random/rng!]]]]

[export seed-initialize!
        [defn random/seed-initialize! []
          [set! seed [bit-xor [time] [time/milliseconds]]]]]

[random/seed-initialize!]

[deftest #t [int? [random/int]]]
[deftest #t [random/seed! 123] [def first-value [random/int]] [random/seed! 123] [= first-value [random/int]]]
[deftest #t [random/seed! 99] [not= [random/int] [random/int]]]