random - Can I make a Deterministic Shuffle in clojure? -
i'd create shuffles of sets same every time programme run:
this 1 way it:
(def colours ["red" "blue" "green" "yellow" "cyan" "magenta" "black" "white"]) (defn colour-shuffle [n] (let [cs (nth (clojure.math.combinatorics/permutations colours) n)] [(first cs) (drop 1 cs)])) ; utilize (rand-int 40320) create numbers, hard code: (def colour-shuffle-39038 (colour-shuffle 39038)) (def colour-shuffle-28193 (colour-shuffle 28193)) (def colour-shuffle-5667 (colour-shuffle 5667)) (def colour-shuffle-8194 (colour-shuffle 8194)) (def colour-shuffle-13895 (colour-shuffle 13895)) (def colour-shuffle-2345 (colour-shuffle 2345)) colour-shuffle-39038 ; ["white" ("magenta" "blue" "green" "cyan" "yellow" "red" "black")] but takes while evaluate, , seems wasteful , rather inelegant.
is there way of generating shuffle 39038 directly, without generating , consuming of sequence?
(i realise can hard code them, or bring effort compile time macro. seems bit rubbish.)
sounds want number permutations:
(def factorial (reductions * 1 (drop 1 (range)))) (defn factoradic [n] {:pre [(>= n 0)]} (loop [a (list 0) n n p 2] (if (zero? n) (recur (conj (mod n p)) (quot n p) (inc p))))) (defn nth-permutation [s n] {:pre [(< n (nth factorial (count s)))]} (let [d (factoradic n) choices (concat (repeat (- (count s) (count d)) 0) d)] ((reduce (fn [m i] (let [[left [item & right]] (split-at (m :rem))] (assoc m :rem (concat left right) :acc (conj (m :acc) item)))) {:rem s :acc []} choices) :acc))) let's seek it:
(def colours ["red" "blue" "green" "yellow" "cyan" "magenta" "black" "white"]) (nth-permutation colours 39038) => ["white" "magenta" "blue" "green" "cyan" "yellow" "red" "black"] ...as in question, without generating of other permutations.
well enough, them all?
(def x (map (partial nth-permutation colours) (range (nth factorial (count colours))))) (count x) => 40320 (count (distinct x)) => 40320 (nth factorial (count colours)) => 40320 note permutations generated in (lexicographic index) order:
user=> (pprint (take 24 x)) (["red" "blue" "green" "yellow" "cyan" "magenta" "black" "white"] ["red" "blue" "green" "yellow" "cyan" "magenta" "white" "black"] ["red" "blue" "green" "yellow" "cyan" "black" "magenta" "white"] ["red" "blue" "green" "yellow" "cyan" "black" "white" "magenta"] ["red" "blue" "green" "yellow" "cyan" "white" "magenta" "black"] ["red" "blue" "green" "yellow" "cyan" "white" "black" "magenta"] ["red" "blue" "green" "yellow" "magenta" "cyan" "black" "white"] ["red" "blue" "green" "yellow" "magenta" "cyan" "white" "black"] ["red" "blue" "green" "yellow" "magenta" "black" "cyan" "white"] ["red" "blue" "green" "yellow" "magenta" "black" "white" "cyan"] ["red" "blue" "green" "yellow" "magenta" "white" "cyan" "black"] ["red" "blue" "green" "yellow" "magenta" "white" "black" "cyan"] ["red" "blue" "green" "yellow" "black" "cyan" "magenta" "white"] ["red" "blue" "green" "yellow" "black" "cyan" "white" "magenta"] ["red" "blue" "green" "yellow" "black" "magenta" "cyan" "white"] ["red" "blue" "green" "yellow" "black" "magenta" "white" "cyan"] ["red" "blue" "green" "yellow" "black" "white" "cyan" "magenta"] ["red" "blue" "green" "yellow" "black" "white" "magenta" "cyan"] ["red" "blue" "green" "yellow" "white" "cyan" "magenta" "black"] ["red" "blue" "green" "yellow" "white" "cyan" "black" "magenta"] ["red" "blue" "green" "yellow" "white" "magenta" "cyan" "black"] ["red" "blue" "green" "yellow" "white" "magenta" "black" "cyan"] ["red" "blue" "green" "yellow" "white" "black" "cyan" "magenta"] ["red" "blue" "green" "yellow" "white" "black" "magenta" "cyan"]) random clojure permutation shuffle deterministic
No comments:
Post a Comment