我是Haskell的新手,我想知道如何使此代碼更高效和整齊。似乎不必要的漫長和不整潔。改進代碼以生成分佈
我的腳本生成10個硬幣翻轉的平均值列表。
import Data.List
import System.Random
type Rand a = StdGen -> Maybe (a,StdGen)
output = do
gen <- newStdGen
return $ distBernoulli 10 10 gen
distBernoulli :: Int -> Int -> StdGen -> [Double]
distBernoulli m n gen = [fromIntegral (sum x)/fromIntegral (length x) | x <- lst]
where lst = splitList (randomList (n*m) gen) n
splitList :: [Int] -> Int -> [[Int]]
splitList [] n = []
splitList lst n = take n lst : splitList (drop n lst) n
randomList :: Int -> StdGen -> [Int]
randomList n = take n . unfoldr trialBernoulli
trialBernoulli :: Rand Int
trialBernoulli gen = Just ((2*x)-1,y)
where (x,y) = randomR (0,1) gen
任何幫助,將不勝感激,謝謝。
對不起,我沒有解釋得很厲害。我基本上試圖創建數據來建立標準的正態分佈。通過虛擬翻轉硬幣(結果1或-1)10次,並取結果的平均值,我們得到-0.2。通過這個過程說1000倍,我們可以繪製結果和他們的頻率,並獲得正態分佈。我想創建一個雙打列表,我可以繪製這個分佈圖。 – Ash 2010-08-06 23:20:53
爲了澄清,該腳本的結果可以是[0.2,0.0,0.0,-0.4,0.6,0.0,-0.2,0.2,0.4,0.0] – Ash 2010-08-06 23:24:28