生成随机值

时间:2016-03-10 03:27:37

标签: haskell

我被困在生成一些正态分布的随机变量上。我正在使用mwc-random软件包。

在GHCI中,我可以这样做:

gen <- create
normal 0 1 gen

在我的机器上产生:

-0.8077385934202513

在我的程序中,我只想创建一次生成器,然后重复使用它为我的模拟生成许多随机值,所以我这样做了:

createGenerator :: PrimMonad m => m (Gen (PrimState m))                                              
createGenerator = do                                                                                 
  gen <- create                                                                                      
  return gen

returnPRNG :: PrimMonad m => Int -> Int -> m Double                                             
returnPRNG 0 1 =  normal 0 1 createGenerator 

但是我收到了一个错误:

Couldn't match type ‘PrimState m’ with ‘Gen (PrimState Gen)’
 Expected type: Gen (PrimState m) 
   Actual type: Gen (Gen (PrimState Gen))

我可能不习惯这样做,所以在这方面的帮助也会很棒。

1 个答案:

答案 0 :(得分:5)

如果您只想创建一次生成器,那么第一部分应该如下所示:

createGenerator :: PrimMonad m => m (Gen (PrimState m))
createGenerator = gen

...

main = do
    ...
    myGen <- createGenerator

(注意你除了给gen另一个名字以外什么都不做?)

然后你必须绕过发电机:

returnPRNG :: PrimMonad m => Double -> Double -> Gen (PrimState m) -> m Double
returnPRNG a b gen =  normal a b gen

当然只是(再次只是另一个名字)

returnPRNG = normal

(请注意,您必须将Double传递给normal - 所以假设额外的参数真的是你必须使用的那些)

程序中的用法如下所示:

main = do
    ...
    myGenen <- createGenerator
    ...
    rndVal1 <- returnPRNG 0 1 myGen
    rndVal2 <- returnPRNG 0 1 myGen

并且注意到它真的只是

main = do
    ...
    myGen <- gen
    ...
    rndVal1 <- normal 0 1 myGen
    rndVal2 <- normal 0 1 myGen