(def *evett* []) (defn n! [n] (if (or (= n 0) (= n 1)) 1 (* n (n! (- n 1))))) (defn calculate-t [l j] (/ (* (Math/exp (- l)) (Math/pow l j)) (n! j))) (let [p-values [0.25 0.22 0.14 0.14 0.069 0.064 0.033 0.033 0.022 0.02 0.013] s-values [0.728 0.166 0.065 0.018 0.018 0.006]] (defn evett ([lamb f-value n] (evett lamb f-value n 100)) ([lamb f-value n lr-cap] (min lr-cap (+ (/ (* (first p-values) (calculate-t lamb (+ 1 n))) (* (second p-values) (nth s-values n) f-value)) (calculate-t lamb 0)))))) (defn random-evett ([] (random-evett 1 1 10 0.01 0.25 1 5)) ([samples] (random-evett samples 1 10 0.01 0.25 1 5)) ([min-lamb max-lamb min-f-values max-f-values min-n max-n] (random-evett 1 min-lamb max-lamb min-f-values max-f-values min-n max-n)) ([samples min-lamb max-lamb min-f-values max-f-values min-n max-n] (dotimes [one samples] (let [lamb (+ (rand max-lamb) min-lamb) f-values (* min-f-values (+ (rand (* 100 max-f-values)) 1)) n (Math/round (rand max-n)) lr (evett lamb f-values n) new-lr (if (>= lr 10) 10 0) ] (def *evett* (conj *evett* [lamb f-values new-lr])))) (let [result *evett*] (def *evett* []) result)))