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 _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
