[英]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.