スキルの発動率について考えてみました。実測データはYou14さんのブログを参照してます。
まず、すべてのスキルを抽選してから、発動することになったスキルに優先順位があり、
それに従って発動しているという仮説をシミュレーションで検証してみました(最後にスクリプトあり)。
1,000,000回の試行で回数を出して、各スキルの発生確率を求めています。
まずは獣と単体αの場合、
[シミュレーションに用いた発動率]
獣=0.44, 単体α=0.23
[実測]
通常:0.44, 獣:0.426, 単体α:0.134
○発動順 獣 > 単体α と仮定(シミュレーション)
通常:0.430871, 獣:0.440216, 単体α:0.128913
発動順 単体α > 獣 と仮定(シミュレーション)
通常:0.431644, 獣:0.338522, 単体α:0.229834
スキルの優先順位ごとに抽選するとした場合の発動率(理論値)
抽選順 獣 > 単体α と仮定(理論値)
通常:0.4312, 獣:0.44, 単体α:0.1288,
抽選順 単体α> 獣 > と仮定(理論値)
通常:0.4312, 獣:0.3388, 単体α:0.23,
次に獣、単体、白悪、必中の場合
[シミュレーションに用いた発動率]
獣=0.44, 単体α=0.23, 必中=0.3, 白悪=0.26
[実測]
通常:0.222, 獣:0.359, 単体α:0.06, 必中:0.103, 白悪:0.256
○発動順 白悪>獣>必中>単体α と仮定(シミュレーション)
通常:0.223261, 獣:0.32585, 単体α:0.066763, 必中:0.12404, 白悪:0.260086
発動順 白悪>必中>獣>単体α と仮定(シミュレーション)
通常:0.223301, 獣9:0.227908, 単体α:0.067042, 必中6:0.221616, 白悪4:0.260133
発動順 獣>単体α>白悪>必中 と仮定(シミュレーション)
通常:0.222791, 単体β1:0.128935, 獣9:0.441201, 必中6:0.095445, 白悪4:0.111628,
○発動順 必中>白悪>獣>単体α と仮定(シミュレーション)
通常:0.223322, 単体β1:0.066298, 獣9:0.228221, 白悪4:0.181582, 必中6:0.300577
抽選順 白悪>獣>必中>単体α と仮定(理論値)
通常:0.22336, 白悪:0.26, 獣:0.3256, 必中:0.12432, 単体α:0.0667
最後にメガラン+単体βの場合
[シミュレーションに用いた発動率]
メガラン=0.20, 単体β=0.25
[実測]
通常:0.63, メガラン:0.135, 単体β:0.236
発動順 単体β > メガラン と仮定(シミュレーション)
通常:0.60015, メガラン:0.199581, 単体β:0.200269
○発動順 メガラン > 単体β と仮定(シミュレーション)
通常:0.599724, メガラン:0.15064, 単体β:0.249636
抽選順 メガラン> 単体β と仮定(理論値)
通常:0.6, メガラン:0.20, 単体β:0.20
○抽選順 単体β > メガラン と仮定(理論値)
通常:0.6, メガラン:0.15, 単体β:0.25
結局、全部を抽選してから発動したものを優先度順に使う場合と優先度順に確率を計算していった場合はほぼ同じ。
ということで、「MS、パイのスキルは公開されていない固有の発動順に従って抽選されている」っぽい。
You14さんの結果から考察すると
白悪>獣>必中>単体α
単体β>メガラン
の優先度のようですね。
追記
ビームコンフュZで使命感が発動するということも言われてますが、確認したところ8回くらいの間に2回使命感発動しました。施行数が少ないですが、
使命感>ビームコンフュ
の優先順位があると考えると計算あいそうですね。これはスキルの組み合わせが効いてきそう。
と思ったら、いくしんさんも同じような考察されていました...
以下、シミュレーション検証コード
#coding:utf-8
import numpy as np
import csv
n=1000000
# 後ろに書いたものが優先
skill_rate=[0.2, 0.25] # メガラン,単体攻撃β
skill_name=[u"通常",u"メガラン",u"単体攻撃β"]
skill_count=[0.0, 0.0, 0.0]
for j in range(0,n):
s = [-1]
for i in range(0, len(skill_rate)):
r = np.random.rand(1)
if r<skill_rate[i]:
s.append(i)
x = s.pop()
skill_count[x+1]=skill_count[x+1]+1
rate = np.array(skill_count)/np.sum(skill_count)
for i in range(0,len(skill_name)):
print("{name}:{rate}".format(name=skill_name[i].encode('utf8'),rate=rate[i]))