Clojure Goodness: Get Random Item From A Sequence
In Clojure we can use the rand-nth
function to get a single random element from a sequence. To get multiple items based on random probability for each item we use the function random-sample
. We must set the probability that determines for each item if it is in the result or not.
In the following example code we use rand-nth
function:
(ns mrhaki.seq.random
(:require [clojure.test :refer [is]]))
;; We use the function rand-nth to get a
;; random element from a sequence collection.
(is (contains? #{"Clojure" "Java" "Groovy"}
(rand-nth ["Groovy", "Clojure", "Java"])))
;; We can use the rand-nth function with a map
;; if we first turn it into a sequence.
(is (contains? #{[:a 1] [:b 2]} (rand-nth (seq {:a 1 :b 2}))))
This next example shows how we can use the random-sample
function:
(ns mrhaki.seq.random
(:require [clojure.test :refer [is]]))
;; Using random-sample each item is in the
;; result based on the random probability of the
;; probability argument.
;; When probability is 1 all items are returned.
(is (= ["Clojure" "Groovy" "Java"]
(random-sample 1.0 ["Clojure" "Groovy" "Java"])))
;; When proability is 0 no item is in the result.
(is (empty? (random-sample 0 ["Clojure" "Groovy" "Java"])))
;; Any other value between 0 and 1 will return different
;; results for each invocation of the random-sample function.
(def samples (random-sample 0.4 ["Clojure" "Groovy"]))
(is (or (empty? samples)
(= ["Clojure" "Groovy"] samples)
(= ["Clojure"] samples)
(= ["Groovy"] samples)))
Written with Clojure 1.10.1