【问题标题】:Using System.Random.Mersenne.Pure64 to generate a random Float in the range [0,1]使用 System.Random.Mersenne.Pure64 生成 [0,1] 范围内的随机浮点数
【发布时间】:2015-10-10 06:05:47
【问题描述】:

我不想使用 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 函数是正确的,因为它返回 correct values for Floats and Doubles according to Wikipedia

【问题讨论】:

    标签: haskell random mersenne-twister


    【解决方案1】:

    我意识到我犯了一个非常愚蠢的错误。 System.Random.Mersenne.Pure64 中的函数 randomDouble 返回一个已经在 [0,1] 范围内的双精度数(documentation does not mention at all),因此我所有的数字都非常小,因为我将它们除以最大双精度数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2010-12-24
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多