Search code examples
clojureclojurescript

Why so many 0s in the answer?


(take 100 (iterate rand-int 300))

evaluates differently, of course, each time... but usually with a ton of zeros. The result always leads with a 300. For example:

(300 93 59 58 25 14 9 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

I would have expected 100 random integers between 0 and 300.

What am I not understanding?


Solution

  • See docs for iterate:

    Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects

    So, that's the reason your sequence is always starting with 300.

    And why there are so many zeros? When you use iterate like this, rand-int takes the previous result and uses it as a new upper limit (exclusive) for a random number. So, your results can look like this:

    300
    => 300
    (rand-int *1)
    => 174
    (rand-int *1)
    => 124
    (rand-int *1)
    => 29
    (rand-int *1)
    => 17
    (rand-int *1)
    => 16
    (rand-int *1)
    => 7
    ...
    

    You can check yourself that this sequence leads to zero.

    If you really want to get 100 random integers between 0 and 300, use repeatedly instead:

    (repeatedly 100 #(rand-int 300))