XorShift On Clojure Failed

TestXS.clj (require 'XorShift) (let [ r_def (XorSh […]

TestXS.clj (require 'XorShift) (let [ r_def (XorSh […]

  • タグ:
  • タグはありません
TestXS.clj
(require 'XorShift)
(let [
r_def (XorShift/make-XorShift-defaultSeed)
r_const (XorShift/make-XorShift 100)
r (XorShift/make-XorShift)
a (atom nil)
]
;
(println ">> defaults")
(println XorShift/defaults)
;
(println ">> seeds in r")
(println (:seeds r))
;
(println ">> rand 0 to UInt32Max")
(loop[i 0](when(< i 5)
(println (XorShift/-rand r_def))
(recur(inc i))))
;0-100(100)
(println ">> randInt 0 to 100")
(loop[i 0](when(< i 5)
(println (XorShift/randInt r_const 0 100))
(recur(inc i))))
;0-1
(println ">> randFloat 0 to 1")
(loop[i 0](when(< i 5)
(println (XorShift/randFloat r 0 1))
(recur(inc i))))
;list
;
(println ">> shuffle list")
(reset! a (for[i (range 20)] i))
(println (XorShift/-shuffle r @a))
(println @a)
;
(println ">> randCount in r")
(println @(:randCount r))
)
;XorShift.clj
(ns XorShift)
(def defaults{
:x 123456789
:y 362436069
:z 521288629
:w 88675123
})
(defprotocol IXorShift
(-rand[self])
(randInt[self & [min max]])
(randFloat[self & [min max]])
(-shuffle[self _arr])
)
(def MXorShift{
:-rand(fn[self]
(swap! (:randCount self) inc)
(let [t (bit-xor @(:x self) (bit-and (bit-shift-left @(:x self) 11) 0xFFFFFFFF))]
(reset! (:x self) @(:y self))
(reset! (:y self) @(:z self))
(reset! (:z self) @(:w self))
(reset! (:w self) (bit-xor (bit-xor @(:w self) (bit-shift-right @(:w self) 19)) (bit-xor t (bit-shift-right t 8))))
)
)
:randInt(fn[self & {:keys [min max] :or {min 0,max 0x7FFFFFFF}}]
(+(mod(-rand self) (inc(- max min))) min)
)
:randFloat(fn[self & {:keys [min max] :or {min 0,max 1}}]
(+(*(float(/(mod(-rand self) 0xFFFF) 0xFFFF)) (- max min)) min)
)
:-shuffle(fn[self _arr]
(let [arr (map #(atom %1) _arr)]
(loop[i 0](when(< i (dec(count arr)))
; (let [r (randInt self i (dec(count arr)))]
; (let [tmp @(nth arr i)]
; (reset! (nth arr i) @(nth arr r))
; (reset! (nth arr r) tmp)
; ))
(recur(inc i))))
(map (fn[v]@v) arr)
)
)
})
(defrecord XorShift[w x y z seeds randCount])
(extend XorShift IXorShift MXorShift)
(defn make-XorShift
([](make-XorShift 10))
([{:keys [w x y z] :or {w 10,x nil,y nil,z nil}}]
(let [x (if(= nil x) (bit-shift-left w 13) x)]
(let [y (if(= nil y) (bit-xor (bit-shift-right w 9) (bit-shift-left x 6)) y)]
(let [z (if(= nil z) (bit-shift-right y 7) z)]
(let [seeds {
:x x
:y y
:z z
:w w
}]
(XorShift. (atom w) (atom x) (atom y) (atom z) seeds (atom 0))
))))
)
)
(defrecord XorShift-defaultSeed[w x y z seeds randCount])
(extend XorShift-defaultSeed IXorShift MXorShift)
(defn make-XorShift-defaultSeed[]
(let [w (:w defaults),x (:x defaults),y (:y defaults),z (:z defaults)]
(let [seeds {
:x x
:y y
:z z
:w w
}]
(XorShift-defaultSeed. (atom w) (atom x) (atom y) (atom z) seeds (atom 0))
))
)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX