вероятность сбития шашки в зависимости от дистанции

код на Хаскеле:

import Control.Monad (guard)
import Text.Printf

die :: [Int]
die = [1..6]

showHitPrs :: IO ()
showHitPrs = mapM_ ( \ r -> printf "%2i  %5.3f\n" (r - 1) (calcProbability r) ) [1..23]
  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
 0  0.306
 1  0.333
 2  0.389
 3  0.417
 4  0.417
 5  0.472
 6  0.167
 7  0.167
 8  0.139
 9  0.083
10  0.056
11  0.083
12  0.000
13  0.000
14  0.028
15  0.028
16  0.000
17  0.028
18  0.000
19  0.028
20  0.000
21  0.000
22  0.000
λ>     

вероятность выставиться в единственную лунку за несколько попыток

код на Хаскеле:

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