Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用System.Random.Mersenne.Pure64生成[0,1]范围内的随机浮点_Haskell_Random_Mersenne Twister - Fatal编程技术网

Haskell 使用System.Random.Mersenne.Pure64生成[0,1]范围内的随机浮点

Haskell 使用System.Random.Mersenne.Pure64生成[0,1]范围内的随机浮点,haskell,random,mersenne-twister,Haskell,Random,Mersenne Twister,我不想使用System.Random,因为它非常慢,我需要生成数百万个随机浮点。我也不能使用System.Random.MWC,因为它不是纯的 我自己也尝试过写这篇文章,但我的解决方案并没有生成一个统一的范围,所有的值都非常接近于0 randomRMSP :: (Float,Float) -> PureMT -> (Float,PureMT) randomRMSP (lo,hi) rng = let (f,rng') = first do

我不想使用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函数是正确的,因为它返回的是我意识到我犯了一个非常愚蠢的错误的值。 System.Random.MERSENE.Pure64中的函数randomDouble返回一个已经在[0,1]范围内的双精度值(该值)因此我的所有数字都非常小,因为我将它们除以最大双精度值