2017-01-26 1 views
3

Вопрос кажется мне простым, но я не мог легко найти ответ.Как сгенерировать n случайных чисел из нормального распределения с использованием random-fu (Haskell)?

Предположим, что вы хотите взять образец размера n из нормального распределения со средним значением 10 и дисперсией 1, а затем получить их среднее значение и дисперсию, чтобы проверить, что образец является нормальным распределением.

Было бы что-то вроде этого, я полагаю:

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

Я пытаюсь использовать библиотеку случайных фу, так что если вы можете дать ответ, используя, что Лив, я бы очень признателен.

ответ

7

В Haskell всегда присутствует неуклюжесть, которая всегда присутствует со случайностью, поскольку Haskell является чистым, вам нужно иметь какой-то «случайный» источник. random-fu использует для этой цели RandomSource, тогда вы работаете внутри этой монады, когда хотите манипулировать случайными значениями.

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 
+0

Я знал, что должен был быть какой-то неловкости. Это то, что я точно искал. Благодаря! –

Смежные вопросы