錬精術式に含まれる当たりの個数の期待値(11/14リニューアル)
錬精術式に含まれる当たりの個数の期待値(11/14リニューアル)
Table of Contents
1 当たりの定義
★5チャイルド、★5ソウルカルタ(以下★5カルタ)、狙ってるコスチュームを全て等しく同じ価値の当たりだとする。
or
★5チャイルド、狙ってるコスチュームを全て等しく同じ価値の当たりだとする。
2 錬精術式に含まれる当たりの個数の期待値
3 錬精術式に含まれる当たりの個数の分布
| コスチューム全体の中で狙うコスチュームの割合 | 0 | 1 | 2 | 3 | 4 |
| 0 | 52.0% | 37.9% | 9.25% | 0.849% | 0.0242% |
| 0.25 | 19.0% | 39.3% | 30.1% | 10.2% | 1.28% |
| 0.55 | 4.93% | 22.1% | 37.3% | 27.9% | 7.80% |
| 0.75 | 0.583% | 6.24% | 24.6% | 42.1% | 26.5% |
| 1 | 0% | 0% | 3.25% | 29.6% | 67.2% |
| コスチューム全体の中で狙うコスチュームの割合 | 0 | 1 | 2 | 3 | 4 |
| 0 | 84.7% | 14.6% | 0.682% | 0.0125% | 0.0000800% |
| 0.25 | 34.5% | 42.7% | 18.9% | 3.56% | 0.242% |
| 0.5 | 10.5% | 33.0% | 36.7% | 17.0% | 2.78% |
| 0.75 | 1.69% | 13.5% | 35.8% | 36.5% | 12.5% |
| 15 | 0% | 0.438% | 15.4% | 46.9% | 37.2% |
3.1 コード6
import Data.List
----------------------------------------------------------------
---- Misc.
-- import Data.Function
(&) = flip ($)
fac 0 = 1
fac n = n * fac (n - 1)
p `c` q = fac p / fac q / fac (p - q)
----------------------------------------------------------------
----------------------------------------------------------------
---- リストの定義
list1 s' s1 s0 = (10 + 31.507*s' + 4*7.131*s1 + 14*2.140*s0) / 100
list2 x r1 r0 n1 n0 = (2 + x*3 + 4*13.355*r1 + 11*2.422*r0 + 3*3.333*n1 + 12*0.410*n0) / 100
list3 x r1 r0 n1 n0 = (2 + x*20 + 4*1.664*r1 + 11*0.300*r0 + 3*11.141*n1 + 12*1.383*n0) / 100
----------------------------------------------------------------
----------------------------------------------------------------
---- 計算
ps x s' s1 s0 r1 r0 n1 n0 = map (\p -> (1-p)) [list1 s' s1 s0, list2 x r1 r0 n1 n0, list3 x r1 r0 n1 n0, list3 x r1 r0 n1 n0]
inv n ps = map (\p -> (1-p)) xs ++ ys
where
(xs, ys) = splitAt n ps
prob i x s' s1 s0 r1 r0 n1 n0 = (ps x s' s1 s0 r1 r0 n1 n0 & permutations & fmap (inv i) & fmap product) & sum & \a -> a * 4 `c` (fromIntegral i) / fac 4
expectedValue x s' s1 s0 r1 r0 n1 n0 = list1 s' s1 s0 + list2 x r1 r0 n1 n0 + 2 * list3 x r1 r0 n1 n0
probabilityDistribution x s' s1 s0 r1 r0 n1 n0 = [ prob i x s' s1 s0 r1 r0 n1 n0 | i <- [0..4] ]
-- 欲するコスチュームの枚数を入れる
analyse 期間限定の枚数 新Sスキンの枚数 旧Sスキンの枚数 新Rスキンの枚数 旧Rスキンの枚数 新Nスキンの枚数 旧Nスキンの枚数 = do
putStrLn "Carta = 1:"
putStr "Expected Value = " >> print (expectedValue 1 s' s1 s0 r1 r0 n1 n0)
putStr "Probability Distribution (from 0 to 4) = " >> print (probabilityDistribution 1 s' s1 s0 r1 r0 n1 n0)
putStrLn ""
putStrLn "Carta = 0:"
putStr "Expected Value = " >> print (expectedValue 0 s' s1 s0 r1 r0 n1 n0)
putStr "Probability Distribution (from 0 to 4) = " >> print (probabilityDistribution 0 s' s1 s0 r1 r0 n1 n0)
where
s' = 期間限定の枚数/1
s1 = 新Sスキンの枚数/4
s0 = 旧Sスキンの枚数/14
r1 = 新Rスキンの枚数/4
r0 = 旧Rスキンの枚数/11
n1 = 新Nスキンの枚数/3
n0 = 旧Nスキンの枚数/12
-- *Main> analyse 0 4 5 2 1 3 0
-- Carta = 1:
-- Expected Value = 2.11457
-- Probability Distribution (from 0 to 4) = [4.75681196502549e-2,0.22088065655753739,0.3767130279258584,0.2790894958746515,7.574869999169788e-2]
--
-- Carta = 0:
-- Expected Value = 1.6845700000000001
-- Probability Distribution (from 0 to 4) = [0.11103970845312854,0.3275175396530426,0.3581510458221004,0.17241645558415672,3.087525048757159e-2]
----------------------------------------------------------------
4 結論
仕組み自体はいままで通り。
Footnotes:
1
コスチュームは一つも要らない。
2
コスチュームの半分ぐらいを狙う。
3
*Main> let n = 0.5 in expectedValue 1 n n n n n n n 2.11461
4
どんなコスチュームが来ても取る。
5
*Main> let n = 0.5 in probabilityDistribution 1 n n n n n n n [4.928843642131877e-2,0.22142455920635618,0.37269553375301884,0.27857150918961876,7.801996142968749e-2]
6
Haskellで書かれてます
Comments
Post a Comment