[Haskell-beginners] questions about randomness
Michael Mossey
mpm at alumni.caltech.edu
Sat Oct 10 03:59:15 EDT 2009
I would like to know if this is a good way to do this job, both from the
point of view of elegance and efficiency. Maybe it needs to be more
strict? I may create lists of 100,000 elements and don't want to run into
space/time problems.
I want to create an infinite list of Floats (for purposes of lazily
zipping or writing later), with the following form: a random number of
zeros, followed by a single random non-zero value, repeat the pattern. I
call it a "break series" for reasons I won't go into here, but in
practice, I want to choose the number of zeros in each section from a
range of integers, and I want the non-zero values to have a particular
frequency distribution. Here's some code I wrote:
import System.Random
import Control.Monad
import Control.Monad.Random
breakSeries :: Rand StdGen [Float]
breakSeries = do
x <- getRandomR (0.0::Float, 1.0)
-- Hacking a simple frequency distribution of values of d.
d <- if x < 0.6
then getRandomR (5.0::Float, 8.0)
else if x < 0.8
then getRandomR (12.0::Float , 24.0)
else getRandomR (60.0::Float , 90.0)
n <- getRandomR (4::Int, 6)
let bits = replicate n 0.0 ++ [d]
liftM (bits++) breakSeries
test = print . take 20 . evalRand breakSeries =<< newStdGen
More information about the Beginners
mailing list