Re: 要望・感想スレッド4 ( No.89 )
日時: 2013/10/21 00:21
名前: SUN
参照: http://pokemon-trainer.net/

>>88 what?さん
わかりにくくて申し訳ないです。
100 - ( ( 80 / 100 ) ^ 2 × ( 0 / 16 × 7 / 8 + 0 / 16 × 1 / 8 ) + ( 80 / 100 ) × ( ( 100 - 80 ) / 100 ) × ( 13 / 16 × 7 / 8 + 0 / 16 × 1 / 8 ) + ( ( 100 - 80 ) / 100 ) × ( 80 / 100 ) × ( 13 / 16 × 7 / 8 + 0 / 16 × 1 / 8 ) + ( ( 100 - 80 ) / 100 ) ^ 2 ) × 100
これが2ターン後の式です。
真ん中の2つの項は1回しか当たってない場合なので通常時に倒せる確率は13/16です。
この方法で立式すると、
( ( 100 - 80 ) / 100 ) ^ (ターン数)
この部分が0になることは絶対にないため、計算結果が100%になることもありません。
nターンに拡張した式を書くと次のようになります。

P(nターン以内に倒せる) = Σ[k=1〜n] {nCk × P(命中)^k × P(命中しない)^(n-k) × P(倒せる | k回命中)}
P(倒せる | k回命中) = (k回以内の命中でHPが0になる場合の数) / (16 ^ k)

ここでP(X)は確率、P(X|Y)は条件付き確率、kは攻撃があたった回数、nCkは組み合わせです。

"毎ターン同じ乱数を引く"という仮定は、すなわち"毎ターンのダメージが同じ"だと仮定することと同じです。
『HP>ダメージ×ターン数』という式は、毎ターンのダメージが異なれば使えません。
ダメージが異なるなら『HP>ダメージ@ターン1 + ダメージ@ターン2 + ダメージ@ターン3 + ...』こうならなければなりません。
したがって、what?さんの仮定は私の言う"1ターン目と2ターン目で同じ乱数を引くという仮定"と一致しています。
毎ターンダメージが変わる状況の場合、乱数は16とおりではありません。
16 ^ (ターン数)通りです。
これはサイコロを2回振った時の場合の数が6通りでなく36通りなのと同じです。
正しい値を求めたい場合は、愚直にやるなら16 ^ (ターン数)通り全て、5ターンなら1048576通り全ての場合について倒せる場合を数え上げる必要があります。
これが、私が瀕死率を公式化することが困難だという理由です。
毎ターンのダメージが同じだという仮定をしても、確定二発までなら正しく計算が行えます。
しかし、例えば1ターンの最大ダメージが40の攻撃でHP200の敵を倒そうとする場合、
急所に当たらないとして5ターンで倒せる真の確率は1/1048576ですが、
what?さんの方法で計算すると1/16になります。
ターン数が多くなるほど無視できない誤差になるため、当サイトの瀕死率では毎ターンのダメージが異なることを再現して作ってあります。