Statistics/Normal distribution: Difference between revisions

added Haskell version
(→‎{{header|Tcl}}: added zkl)
(added Haskell version)
Line 436:
*
</pre>
=={{header|Haskell}}==
<lang haskell>import Data.Map (Map, empty, insert, findWithDefault, toList)
import Data.Maybe (fromMaybe)
import Text.Printf (printf)
import Data.Function (on)
import Data.List (sort, maximumBy, minimumBy)
import Control.Monad.Random (RandomGen, Rand, evalRandIO, getRandomR)
import Control.Monad (replicateM)
 
-- Box-Muller
getNorm :: RandomGen g => Rand g Double
getNorm = do
u0 <- getRandomR (0.0, 1.0)
u1 <- getRandomR (0.0, 1.0)
let r = sqrt $ (-2.0) * log u0
theta = 2.0 * pi * u1
return $ r * sin theta
 
putInBin :: Double -> Map Int Int -> Double -> Map Int Int
putInBin binWidth t v =
let bin = round (v / binWidth)
count = findWithDefault 0 bin t
in insert bin (count+1) t
 
runTest :: Int -> IO ()
runTest n = do
rs <- evalRandIO $ replicateM n getNorm
let binWidth = 0.1
 
tally v (sv, sv2, t) = (sv+v, sv2 + v*v, putInBin binWidth t v)
 
(sum, sum2, tallies) = foldr tally (0.0, 0.0, empty) rs
 
tallyList = sort $ toList tallies
 
printStars tallies binWidth maxCount selection =
let count = findWithDefault 0 selection tallies
bin = binWidth * fromIntegral selection
maxStars = 100
starCount = if maxCount <= maxStars
then count
else maxStars * count `div` maxCount
stars = replicate starCount '*'
in printf "%5.2f: %s %d\n" bin stars count
 
mean = sum / fromIntegral n
stddev = sqrt (sum2/fromIntegral n - mean*mean)
 
printf "\n"
printf "sample count: %d\n" n
printf "mean: %9.7f\n" mean
printf "stddev: %9.7f\n" stddev
 
let maxCount = snd $ maximumBy (compare `on` snd) tallyList
maxBin = fst $ maximumBy (compare `on` fst) tallyList
minBin = fst $ minimumBy (compare `on` fst) tallyList
 
mapM_ (printStars tallies binWidth maxCount) [minBin..maxBin]
 
main = do
runTest 1000
runTest 2000000</lang>
 
{{out}}
<pre style="font-size:80%">sample count: 1000
mean: -0.0269949
stddev: 0.9795285
-3.10: ** 2
-3.00: 0
-2.90: 0
-2.80: ** 2
-2.70: * 1
-2.60: **** 4
-2.50: ** 2
-2.40: ** 2
-2.30: 0
-2.20: *** 3
-2.10: ***** 5
-2.00: ****** 6
-1.90: ****** 6
-1.80: *********** 11
-1.70: ************ 12
-1.60: ******* 7
-1.50: ************* 13
-1.40: ***************** 17
-1.30: ******************** 20
-1.20: **************** 16
-1.10: ***************** 17
-1.00: ********************** 22
-0.90: *************************** 27
-0.80: ********************** 22
-0.70: ******************************** 32
-0.60: ********************************* 33
-0.50: ****************************************** 42
-0.40: *********************************************** 47
-0.30: ************************************************ 48
-0.20: *************************** 27
-0.10: ***************************** 29
0.00: *********************************************** 47
0.10: *************************************************** 51
0.20: ****************************************** 42
0.30: ******************************** 32
0.40: ********************************* 33
0.50: ***************************************** 41
0.60: ****************************************** 42
0.70: **************************** 28
0.80: ********************** 22
0.90: *************************** 27
1.00: ******************* 19
1.10: ********************** 22
1.20: ************************ 24
1.30: ******************** 20
1.40: ***************** 17
1.50: ********** 10
1.60: ************* 13
1.70: **** 4
1.80: *** 3
1.90: ******* 7
2.00: ****** 6
2.10: * 1
2.20: * 1
2.30: ******* 7
2.40: *** 3
2.50: 0
2.60: * 1
2.70: 0
2.80: 0
2.90: 0
3.00: * 1
3.10: 0
3.20: 0
3.30: * 1
 
sample count: 2000000
mean: 0.0001017
stddev: 0.9994329
-4.60: 3
-4.50: 2
-4.40: 3
-4.30: 9
-4.20: 18
-4.10: 19
-4.00: 20
-3.90: 41
-3.80: 77
-3.70: 84
-3.60: 105
-3.50: 189
-3.40: 245
-3.30: 350
-3.20: 460
-3.10: 619
-3.00: * 838
-2.90: * 1234
-2.80: * 1586
-2.70: ** 2063
-2.60: *** 2716
-2.50: **** 3503
-2.40: ***** 4345
-2.30: ******* 5678
-2.20: ******** 7160
-2.10: *********** 8856
-2.00: ************* 10915
-1.90: **************** 13299
-1.80: ******************* 15599
-1.70: *********************** 19004
-1.60: *************************** 22321
-1.50: ******************************** 25940
-1.40: ************************************* 29622
-1.30: ****************************************** 34213
-1.20: ************************************************ 38922
-1.10: ****************************************************** 43415
-1.00: ************************************************************ 48250
-0.90: ****************************************************************** 53210
-0.80: ************************************************************************ 58127
-0.70: ****************************************************************************** 62438
-0.60: *********************************************************************************** 66650
-0.50: **************************************************************************************** 70298
-0.40: ******************************************************************************************** 73739
-0.30: *********************************************************************************************** 75831
-0.20: ************************************************************************************************** 78222
-0.10: *************************************************************************************************** 79412
0.00: **************************************************************************************************** 79801
0.10: *************************************************************************************************** 79255
0.20: ************************************************************************************************* 78163
0.30: ************************************************************************************************ 76667
0.40: ******************************************************************************************** 73554
0.50: **************************************************************************************** 70391
0.60: *********************************************************************************** 66566
0.70: ****************************************************************************** 62857
0.80: ************************************************************************ 57962
0.90: ****************************************************************** 53407
1.00: ************************************************************ 48565
1.10: ****************************************************** 43496
1.20: ************************************************ 38799
1.30: ****************************************** 34156
1.40: ************************************* 29713
1.50: ******************************** 25946
1.60: *************************** 22264
1.70: *********************** 18843
1.80: ******************* 15780
1.90: **************** 13151
2.00: ************* 10905
2.10: ********** 8690
2.20: ******** 7102
2.30: ******* 5693
2.40: ***** 4459
2.50: **** 3550
2.60: *** 2603
2.70: ** 2155
2.80: ** 1619
2.90: * 1121
3.00: * 914
3.10: 607
3.20: 478
3.30: 349
3.40: 216
3.50: 170
3.60: 113
3.70: 79
3.80: 58
3.90: 48
4.00: 33
4.10: 20
4.20: 9
4.30: 8
4.40: 7
4.50: 3
4.60: 3
4.70: 0
4.80: 1
4.90: 1
</pre>
=={{header|J}}==
'''Solution'''