サイコロを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