aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/probabilities/examples_monte_carlo.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/clojure/contrib/probabilities/examples_monte_carlo.clj')
-rw-r--r--src/clojure/contrib/probabilities/examples_monte_carlo.clj69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/clojure/contrib/probabilities/examples_monte_carlo.clj b/src/clojure/contrib/probabilities/examples_monte_carlo.clj
new file mode 100644
index 00000000..13796e2f
--- /dev/null
+++ b/src/clojure/contrib/probabilities/examples_monte_carlo.clj
@@ -0,0 +1,69 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Monte-Carlo application examples
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(ns clojure.contrib.probabilities.random.examples-monte-carlo
+ (:require [clojure.contrib.generic.collection :as gc])
+ (:use [clojure.contrib.probabilities.random-numbers
+ :only (lcg rand-stream)])
+ (:use [clojure.contrib.probabilities.finite-distributions
+ :only (uniform)])
+ (:use [clojure.contrib.probabilities.monte-carlo
+ :only (random-stream discrete interval normal lognormal exponential
+ n-sphere
+ sample sample-sum sample-mean sample-mean-variance)]
+ :reload)
+ (:use [clojure.contrib.monads
+ :only (domonad state-m)]))
+
+; Create a linear congruential generator
+(def urng (lcg 259200 7141 54773 1))
+
+;; Use Clojure's built-in random number generator
+;(def urng rand-stream)
+
+; Sample transformed distributions
+(defn sample-distribution
+ [n rt]
+ (take n (gc/seq (random-stream rt urng))))
+
+; Interval [-2, 2)
+(sample-distribution 10 (interval -2 2))
+; Compare with a direct transformation
+(= (sample-distribution 10 (interval -2 2))
+ (map (fn [x] (- (* 4 x) 2)) (take 10 (gc/seq urng))))
+
+; Normal distribution
+(sample-distribution 10 (normal 0 1))
+
+; Log-Normal distribution
+(sample-distribution 10 (lognormal 0 1))
+
+; Exponential distribution
+(sample-distribution 10 (exponential 1))
+
+; n-sphere distribution
+(sample-distribution 10 (n-sphere 2 1))
+
+; Discrete distribution
+(sample-distribution 10 (discrete (uniform (range 1 7))))
+
+; Compose distributions in the state monad
+(def sum-two-dists
+ (domonad state-m
+ [r1 (interval -2 2)
+ r2 (normal 0 1)]
+ (+ r1 r2)))
+
+(sample-distribution 10 sum-two-dists)
+
+; Distribution transformations
+(sample-distribution 5 (sample 2 (interval -2 2)))
+(sample-distribution 10 (sample-sum 10 (interval -2 2)))
+(sample-distribution 10 (sample-mean 10 (interval -2 2)))
+(sample-distribution 10 (sample-mean-variance 10 (interval -2 2)))
+