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))
	))
)