History always repeats itself and sometimes that's good. Here's a second chance to be part of it: tmdtc.com

Tuesday, 10 March 2009

Generate a random string in Clojure

In my quest to learn Lisp, I discovered Clojure, a List inspired language on the JVM. I really like it and hope to be able to use it more and more.
Here's a code snippet to generate a random string in Clojure. This is something I end up using a many projects. This is a version that is not made to be the shortest, but the most readable. And as you can see, access to Java's classes and libraries is very easy:


:use java's random generator
(def random (java.util.Random.))
;define characters list to use to generate string
(def chars
(map char (concat (range 48 58) (range 66 92) (range 97 123))))
;generates 1 random character
(defn random-char []
(nth chars (.nextInt random (count chars))))
; generates random string of length characters
(defn random-string [length]
(apply str (take length (repeatedly random-char))))


Suggestions to improve the code are welcome, I'm still a newbie in Lisp-style programming and Clojure!

1 comments:

Jeff said...

A slightly modified version, without using Java's random and with corrected ranges for the characters. (Annoying that blogger won't allow code or pre tags...)

(def VALID-CHARS
(map char (concat (range 48 58) ; 0-9
(range 66 91) ; A-Z
(range 97 123)))) ; a-z

(defn random-char []
(nth VALID-CHARS (rand (count VALID-CHARS))))

(defn random-str [length]
(apply str (take length (repeatedly random-char))))