I haven't read all of your code, but note that the Haskell algorithm says it takes a sequence of random values where the first is in the range [0,n-1], the second in the range [0,n-2], third in [0,n-3], etc. Your repeatedly call here:
https://github.com/pebrc/ninety-nine-clojure/blob/master/src/ninety_nine_clojure/lists.clj#L273 Is generating a sequence of random values that are all in the range [0,n-1]. A couple of style comments on your function perfect-functional-shuffle: I find it easier to read when a let or loop has multiple bindings on one line if it has commas between the symbol value pairs, e.g.: (loop [bst bst, rnds rnds, acc []] Clojure treats commas in source code as white space. The default case in a cond is most often written :else rather than :otherwise, but both are clear in their meaning and have the same behavior (i.e. any value there other than nil or false will be treated as true). I prefer to write two-branch cond statements using if rather than cond. Andy On Thu, Mar 20, 2014 at 1:59 PM, Peter Brachwitz <peter.brachw...@gmail.com>wrote: > I tried to implement perfect functional shuffle in Clojure as outlined in > http://okmij.org/ftp/Haskell/perfect-shuffle.txt > > This is purely for educational purposes as I am learning Clojure (so > please don't be too hard on me if I did something silly) > > The code: > > https://github.com/pebrc/ninety-nine-clojure/blob/master/src/ninety_nine_clojure/lists.clj#L267 > > A related blog post: > > http://pbrc.blogspot.com/2014/03/99-clojure-problems-25-generate-random.html > > I would be very happy about any feedback/review. If you have a look at the > blog post you will find a histogram that seems to indicate that my perfect > functional shuffle is not quite perfect because it is not a uniform > distribution. That is almost certainly a mistake on my part, again, I would > be very grateful for any hints. > > Cheers, > Peter > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.