サイコロを100回振って、各目の出る割り合いを求める

30分プログラム、その653。サイコロを100回振って、各目の出る割り合いを求めてみる。

ソーシャル・ネットワーキング サービス [mixi(ミクシィ)]にインスパイアされました。

問題2.1〜6の目が出るサイコロを100回振って、1〜6の目が出る割合を求めるプログラムを作成せよ

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
}

includeするヘッダファイルが全部指定されてるなんて、親切な問題ですね。
せっかくなので、みずぴー日記で教えてもらったData.Mapを使ってみました。

使い方

*Main> rollDice 100
[(1,21.0),(2,17.0),(3,18.0),(4,13.0),(5,14.0),(6,17.0)]

ソースコード

import System.Random
import qualified Data.IntMap as M

dices :: IO [Int]
group :: [Int] -> [(Int,Int)]
rollDice :: Int -> IO [(Int,Float)]

dices = do g <- getStdGen
           return $ randomRs (1,6) g
group xs = M.toList $ foldl (\map n -> M.insertWith (+) n 1 map) M.empty xs

float = fromIntegral
rollDice n = do ds <- dices
                return $ map (\(k,v) -> (k,(float v)/(float n) * 100))
                       $ group
                       $ take n ds