1
中的隨機Float我不想使用System.Random,因爲它顯着更慢,我需要生成數百萬隨機的浮點數。我也不能使用System.Random.MWC,因爲它不是純粹的。使用System.Random.Mersenne.Pure64生成範圍[0,1]
我做出了嘗試在此寫自己,但我的解決方案不會產生一個統一的範圍內,所有的值非常接近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功能是正確的,因爲它返回correct values for Floats and Doubles according to Wikipedia