繁体   English   中英

产生随机值

[英]Generating random values

我被困在生成一些正态分布的随机变量上。 我正在使用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))

我可能不是惯于这样做的,因此在该领域的任何帮助也将非常有用。

如果只想创建一次生成器,那么您的第一部分应该是这样的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM