【问题标题】:How to generate n random numbers from a normal distribution using random-fu (Haskell)?如何使用 random-fu (Haskell) 从正态分布中生成 n 个随机数?
【发布时间】:2017-06-11 16:12:02
【问题描述】:

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

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

我想应该是这样的:

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

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

【问题讨论】:

    标签: haskell random statistics


    【解决方案1】:

    在 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
    

    【讨论】:

    • 我知道会有一些尴尬。这正是我一直在寻找的。谢谢!
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2013-07-22
    • 2010-11-21
    • 2016-09-21
    相关资源
    最近更新 更多