Bug in the scaling of randoms in "Haskel: The Craft of Functional Programming"
In his excellent book Simon Thompson defines scaling of the elements of a sequence of random numbers from the interval [0, 65535] to an interval [s,t] in the following way (top of page 368):
scaleSequence :: Int -> Int -> [Int] -> [Int] scaleSequence s t = map scale where scale n = n `div` denom + s range = t - s + 1 denom = modulus `div` range
where modulus = 65536 However, the following expression:
e4000 = (scaleSequence 1 966 ([65231] ++ [1..965]))!!0
evaluates to 974 -- clearly outside of the specified interval. I'm using the following scaling function, the correctness of which I believe can be proven:
randScale :: Float -> Float -> Int -> Int randScale s t n = floor (rndScl ((t - s + 1)/ dintRange ) s n) where dintRange = fromInt (modulus - 1)
rndScl :: Float -> Float -> Int -> Float rndScl a b n = a * fromInt n + b
scaleSequence2 :: Int -> Int -> [Int] -> [Int] scaleSequence2 s t = map scale where scale n = randScale (fromInt s) (fromInt t) n
Could somebody please, provide a corrected definition that still uses modulo arithmetics? Cheers, Dimitre Novatchev. __________________________________________________ Do You Yahoo!? Yahoo! Health - your guide to health and wellness http://health.yahoo.com
participants (1)
-
Dimitre Novatchev