錬精術式に含まれる当たりの数の期待値(5/16リニューアル)

錬精術式に含まれる当たりの数の期待値(5/16リニューアル)

錬精術式に含まれる当たりの数の期待値(5/16リニューアル)

1 当たりの定義

★5チャイルド、★5ソウルカルタ、狙ってるコスチュームを全て等しく同じ価値の当たりだとする。

b def= ボタンのコスチュームを狙ってるなら1、そうでないなら0
s1 def= 新コスチュームSのうちで狙ってるコスチュームが含まれる割合
s0 def= 旧コスチュームSのうちで狙ってるコスチュームが含まれる割合

r1 def= 新コスチュームRのうちで狙ってるコスチュームが含まれる割合
r0 def= 旧コスチュームRのうちで狙ってるコスチュームが含まれる割合

n1 def= 新コスチュームNのうちで狙ってるコスチュームが含まれる割合
n0 def= 旧コスチュームNのうちで狙ってるコスチュームが含まれる割合

2 錬精術式に含まれる当たりの数の期待値

0.1 + 0.31503 b + 3 0.09511 s1 + 7 0.04280 s0
+ 0.05 + 3 0.17791 r1 + 4 0.06664 r0 + 5 0.02001 n1 + 4 0.01240 n0
+ 2(0.22 + 3 0.02221 r1 + 4 0.00830 r0 + 5 0.06673 n1 + 4 0.04162 n0)

= 0.31503 b + 0.38256 n0 + 0.76735 n1 + 0.33296 r0 + 0.66699 r1 + 0.2996 s0 + 0.28533 s1 + 0.59

2.1 b = s0 = s1 = r0 = r1 = n0 = n1 = 0 (コスチュームは一つも要らない)

0.59

2.2 b = s0 = s1 = r0 = r1 = n0 = n1 = 0.5 (コスチュームの半分ぐらいを狙う)

2.115

2.3 b = s0 = s1 = r0 = r1 = n0 = n1 = 1 (どんなコスチュームが来ても取る)

3.64

3 錬精術式に含まれる当たりの数の分布

Table 1: 当たりの数の分布
  0 1 2 3 4
b = s0 = … = n1 = 0 52.0% 37.1% 9.25% 0.849% 0.0242%
b = s0 = … = n1 = 0.51 4.95% 22.2% 37.3% 27.8% 7.77%
b = s0 = … = n1 = 1 0% 0% 3.36% 29.7% 66.9%

3.1 コード2

import Data.List

-- import Data.Function
(&) = flip ($)

fac 0 = 1
fac n = n * fac (n - 1)

p `c` q = fac p / fac q / fac (p - q)

list1 b s1 s0 = (10 + 31.053*b + 9.511*3*s1 + 4.280*7*s0) / 100
list2 r1 r0 n1 n0 = (5 + 17.791*3*r1 + 6.664*4*r0 + 2.001*5*n1 + 1.240*4*n0) / 100
list3 r1 r0 n1 n0 = (22 + 2.221*3*r1 + 0.830*4*r0 + 6.673*5*n1 + 4.162*4*n0) / 100

-- list1 1 1 1 ~= 1
-- list2 1 1 1 1 ~= 1
-- list3 1 1 1 1 ~= 0.82

ps b s1 s0 r1 r0 n1 n0 = map (\p -> (1-p)) [list1 b s1 s0, list2 r1 r0 n1 n0, list3 r1 r0 n1 n0, list3 r1 r0 n1 n0]

inv n ps = map (\p -> (1-p)) xs ++ ys
  where
    (xs, ys) = splitAt n ps

prob k b s1 s0 r1 r0 n1 n0 = (ps b s1 s0 r1 r0 n1 n0 & permutations & fmap (inv k) & fmap product) & sum & \x -> x * 4 `c` (fromIntegral k) / fac 4

expectedValue b s1 s0 r1 r0 n1 n0 = list1 b s1 s0 + list2 r1 r0 n1 n0 + 2 * list3 r1 r0 n1 n0

probabilityDistribution b s1 s0 r1 r0 n1 n0 = [ prob i b s1 s0 r1 r0 n1 n0 | i <- [0..4] ]

analyse ボタンの枚数 新Sスキンの枚数 旧Sスキンの枚数 新Rスキンの枚数 旧Rスキンの枚数 新Nスキンの枚数 旧Nスキンの枚数 = do
  putStr "Expected Value = " >> print (expectedValue b s1 s0 r1 r0 n1 n0)
  putStr "Probability Distribution (from 0 to 4) = " >> print (probabilityDistribution b s1 s0 r1 r0 n1 n0)
  where
    b = ボタンの枚数/1
    s1 = 新Sスキンの枚数/3
    s0 = 旧Sスキンの枚数/7
    r1 = 新Rスキンの枚数/3
    r0 = 旧Rスキンの枚数/4
    n1 = 新Nスキンの枚数/5
    n0 = 旧Nスキンの枚数/4

-- *Main> analyse 0 2 6 1 1 1 1
-- Expected Value = 1.5917
-- Probability Distribution (from 0 to 4) = [0.1253215186656322,0.35250966481603957,0.3503489779580888,0.14878697497317536,2.303286358706413e-2]

4 感想

リニューアルでリスト4の☆5ソウルカルタがなくなってしまったのが大きな変更点。

あと思いの外、式が繁雑になってしまったのが不満である。

Footnotes:

1
*Main> probabilityDistribution 0.5 0.5 0.5 0.5 0.5 0.5 0.5
[4.950367993908424e-2,0.22190974382330697,0.3727547993955735,0.27808644998259496,7.774532685944019e-2]
2

Haskellで書かれてます

Created: 2019-06-23 日 11:10

Emacs 25.2.1 (Org mode 8.2.10)

Validate

Comments