haskell - 如何使用 random-fu (Haskell) 从正态分布生成 n 个随机数?

标签 haskell random statistics

这个问题对我来说似乎很简单,但我无法轻易找到答案。

假设您想从均值为 10 且方差为 1 的正态分布中抽取大小为 n 的样本,然后获取它们的平均值和方差以验证样本是否来自正态分布。

它会是这样的,我想:

values = take n $ sample (normal 10 1)
(avg values, variance values)

我正在尝试使用库 random-fu,因此如果您可以使用该库提供答案,我将不胜感激。

最佳答案

Haskell 中总是存在随机性的尴尬 - 由于 Haskell 是纯的,您需要有某种“随机”源。 random-fu用途 RandomSource 为此,当您想要操作随机值时,您可以在这个 monad 中工作。

import Data.Random
import Control.Monad (replicateM)

average :: [Double] -> Double
average xs = sum xs / fromIntegral (length xs)

variance :: [Double] -> Double
variance xs = average [ (x - m)^2  | x <- xs ] 
  where m = average xs

main :: IO ()
main = do
  sample <- runRVar (replicateM 10 (normal 10 1)) StdRandom :: IO [Double]
  putStrLn $ "Average: " ++ show (average sample)
  putStrLn $ "Variance: " ++ show (variance sample)

试运行似乎给了我合理的输出:
ghci> main
Average: 10.294887142436771
Variance: 0.7129578122237161
ghci> main
Average: 9.677325092160597
Variance: 0.9894150286175698
ghci> main
Average: 9.714089727813253
Variance: 1.0279068711054316
ghci> main
Average: 10.32028785267642
Variance: 0.8574243439019995
ghci> main
Average: 9.696843993234065
Variance: 0.45301180269725994

关于haskell - 如何使用 random-fu (Haskell) 从正态分布生成 n 个随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41869238/

相关文章:

linux - 从一个文件中随机选择几行,然后从第二个文件中选择相同的行号

function - 评估 R 循环中的变量

python - 如何在Python中计算矩生成函数的导数?

haskell - 如何在 haskell 中验证 OpenSSH 签名?

haskell - 在 ghci 中指定 "load"操作的搜索路径

java - 从集合中选择一个随机元素

c++ - 熵和并行随机数生成器播种

haskell - 如何获取 TemplateHaskell 命名变量的文字值

haskell - 为什么产品 [0..] 不评估为 0 "instantly"?

java.util.UUID.randomUUID().toString() 长度