Question

I have written the following piece of code for a random walk, which draws random values from {-1,1}.

(defn notahappyfoo [n]
(reverse (butlast (butlast (reverse (interleave (take n (iterate rand (- 0 1)))(take n (iterate rand 1))))))))

However, the code fails to generate a satisfactory walk. The main problem stems from the function rand. It's lower bound is 0, which forced the awkward code I wrote. Namely, the function interleave ends up causing wild shifts in the walk as values are forced to swing from positive to negative. It will be hard to garner any sense of a continuous path with this code.

I believe there should be an elegant form in Clojure to construct this walk. But I am not able to piece the right functions together to generate such a walk. The goals of the function I am looking to construct consist of lower and upper bounds for the random number. In the code above I have forced the interval -1 to 1. It would be nice to generalize this to -a and a. Moreover, how do I form a collection of random reals (floating points) between -a and a that has some notion of continuity?

Was it helpful?

Solution

You need a random function that takes a range

(defn myrand [a b] 
  (+ a (rand (- b a))))

You can then create a sequence

(def s (repeatedly #(myrand -1 1)))

finally you can use reductions to get a sample walk

(take 10 s)

(reductions + (take 10 s))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top