On Sun, Jan 11, 2009 at 9:35 PM, GS <gsincl...@gmail.com> wrote: > > Hi, > > For the purposes of testing another function (not discussed here), I > wrote a function to generate random strings. This is what I ended up > with after some trial and error. > > (defn generate-data [size maxlength] > ; Returns a collection of 'size random strings, each at most 'maxlength > chars. > (let [alphabet "abcdefghijklmnopqrstuvwxyz" > rand-letter (fn [_] (nth alphabet (rand-int 26))) > rand-stream (map rand-letter (iterate inc 0)) > rand-string (fn [n] (apply str (take n rand-stream)))] > (map (fn [_] (rand-string (rand-int maxlength))) > (range size)))) > > ; test > (generate-data 25 19) > > The output of the testing function is something like ("gr", "gry", > "gr", "g", "gry"). That is, is always _takes_ from the same sequence > of random characters. > > Is there a way I might modify the above code so rand-stream is indeed > a stream (with new random data each time) instead of a sequence (where > every _take_ starts from the beginning)?
That generates a single rand-stream and then takes various amounts from it in your 'map'. To get a new random sequence each time, you'd have to move the definition of rand-stream into your 'map' fn so that each item of the map gets its own random stream. Here's one way to do that: (defn generate-data [size maxlength] (for [i (range size)] (apply str (take (rand-int maxlength) (repeatedly #(char (+ (int \a) (rand-int 26)))))))) But since this is returning a lazy stream (as your original did), there's not much value in passing in the size: (defn seq-of-rand-strings [maxlength] (repeatedly (fn [] (apply str (take (rand-int maxlength) (repeatedly #(char (+ (int \a) (rand-int 26))))))))) user=> (take 3 (seq-of-rand-strings 10)) ("kae" "xwuwyp" "xa") --Chouser --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---