Использование System.Random.Mersenne.Pure64 для генерации случайного числа с плавающей точкой в ​​диапазоне [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 верна, потому что она возвращает правильные значения для чисел с плавающей точкой и двойников в соответствии с Википедией

1 ответ

Решение

Я понял, что совершаю очень глупую ошибку. Функция randomDouble в System.Random.Mersenne.Pure64 возвращает значение типа double, уже находящееся в диапазоне [0,1] (о котором документация не упоминает вообще), и, следовательно, все мои числа были очень малы, потому что я делил их на max double,

Другие вопросы по тегам