код на Хаскеле:
import Control.Monad (guard) import Text.Printf die :: [Int] die = [1..6] showHitPrs :: IO () showHitPrs = mapM_ ( \ r -> printf "%2i %5.3f\n" r (calcProbability r) ) [1..24] where hits :: Int -> [Int] hits x = die >>= \ d1 -> die >>= \ d2 -> guard ( (d1 + d2 == x) || (d1 == x) || (d2 == x) || ((d1 == d2) && ((3 * d1 == x) || (4 * d1 == x))) ) >> return 1 -- just flag of success calcProbability :: Int -> Double calcProbability r = (fromIntegral $ sum $ hits r) / 36.0
результаты (дистанция - вероятность) :
λ> showHitPrs 1 0.306 2 0.333 3 0.389 4 0.417 5 0.417 6 0.472 7 0.167 8 0.167 9 0.139 10 0.083 11 0.056 12 0.083 13 0.000 14 0.000 15 0.028 16 0.028 17 0.000 18 0.028 19 0.000 20 0.028 21 0.000 22 0.000 23 0.000 24 0.028
код на Хаскеле:
import Text.Printf showBearin :: IO () showBearin = mapM_ (printf "%5.3f\n") $ scanl1 (+) [x1, x2, x3, x4, x5, x6, x7] where x1, x2, x3, x4, x5, x6, x7 :: Double x1 = 11/36 x2 = (1 - x1) * x1 x3 = (1 - x1 - x2) * x1 x4 = (1 - x1 - x2 - x3) * x1 x5 = (1 - x1 - x2 - x3 - x4) * x1 x6 = (1 - x1 - x2 - x3 - x4 - x5) * x1 x7 = (1 - x1 - x2 - x3 - x4 - x5 - x6) * x1
результаты (попытка - вероятность) :
0.306 0.518 0.665 0.767 0.838 0.888 0.922