2015-07-20 80 views
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

回答

3

我意識到我犯了一個非常愚蠢的錯誤。 System.Random.Mersenne.Pure64中的函數randomDouble返回一個已經在[0,1]範圍內的數字(其中documentation does not mention at all),因此我所有的數字都非常小,因爲我將它們除以最大加倍。