返回浮点数和双精度的正确值
我不想使用System。随机,因为它非常慢,我需要生成数百万个随机浮点数。我也不能使用System.Random.MWC,因为它不是纯的。
我试着自己写这个,但是我的解决方案没有生成一个统一的范围,所有的值都非常接近0。
randomRMSP :: (Float,Float) -> PureMT -> (Float,PureMT)
randomRMSP (lo,hi) rng =
let (f,rng') = first double2Float (randomDouble rng)
in (lo + f / (maxFloat + 1) * (hi - lo + 1),rng')
maxRealFloat :: RealFloat a => a -> a
maxRealFloat a = encodeFloat m n where
b = floatRadix a
e = floatDigits a
(_, e') = floatRange a
m = b ^ e - 1
n = e' - e
我很确定maxRealFloat函数是正确的,因为它根据维基百科
我意识到我犯了一个非常愚蠢的错误。在System.Random.Mersenne中的randomDouble函数。Pure64返回一个已经在[0,1]范围内的双精度值(文档中根本没有提到),因此我所有的数字都非常小,因为我将它们除以最大双精度值。