使用 System.Random.Mersenne.Pure64 生成 [0,1] 范围内的随机浮点数
Using System.Random.Mersenne.Pure64 to generate a random Float in the range [0,1]
我不想使用 System.Random,因为它明显更慢而且我需要生成数百万个随机浮点数。我也不能使用 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 函数是正确的,因为它 returns correct values for Floats and Doubles according to Wikipedia
我意识到我犯了一个非常愚蠢的错误。
System.Random.Mersenne.Pure64 returns 中的函数 randomDouble 已经在 [0,1] 范围内(documentation does not mention at all),因此我所有的数字都非常小,因为我将它们除以最大双倍。
我不想使用 System.Random,因为它明显更慢而且我需要生成数百万个随机浮点数。我也不能使用 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 函数是正确的,因为它 returns correct values for Floats and Doubles according to Wikipedia
我意识到我犯了一个非常愚蠢的错误。 System.Random.Mersenne.Pure64 returns 中的函数 randomDouble 已经在 [0,1] 范围内(documentation does not mention at all),因此我所有的数字都非常小,因为我将它们除以最大双倍。