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

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

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