[Haskell-cafe] Performance problem with random numbers

ntupel ntupel at googlemail.com
Sat Oct 13 14:59:15 EDT 2007


On Sat, 2007-10-13 at 13:35 -0400, Brandon S. Allbery KF8NH wrote:
> For starters, look into "seq". Try applying it to any expression  
> using a generated random number.  This should force evaluation to  
> occur somewhere other than when random is trying to figure out what  
> StdGen value it's been told to use as its initial state.
> 

Ok, but I still wonder where that might be. random and randomR are used
in a function named "next" as show here:

next :: (Array Int a, Array Int a, UArray Int Double) -> StdGen -> (a,
StdGen)
next (xs, as, rs) g =
    let n = length $ indices xs
        (x1, g1) = randomR (0, n - 1) g
        (x2, g2) = random g1
        r = rs!x1
    in
        if x2 <= r 
            then (xs!x1, g2) 
            else (as!x1, g2)


x1 and x2 are used in the same function so I assume this already
requires their evaluation. The only function that calls "next" is
randomList:

randomList :: (Array Int a, Array Int a, UArray Int Double) -> StdGen ->
[a]
randomList t g = 
    let (n, g') = next t g
    in 
        n:randomList t g'

Cf. my original e-mail for the complete program. 

> Alternately you can put all the uses in IO and use  
> Control.Exception.evaluate (or even print).  This is probably not  
> what you want to do in your actual production code, however.
> 

Right. This is not what I want.

Many thanks again,
Thoralf




More information about the Haskell-Cafe mailing list