Re: 要望・感想スレッド4 ( No.87 ) |
- 日時: 2013/10/20 08:17
- 名前: SUN
- 参照: http://pokemon-trainer.net/
- (つづき)
この確率は、 ( 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 ) です。 修正した式はいわゆる2項分布ですね。 これで倒せる確率を計算すると73.25%となり、ダメージ計算機JS-5の瀕死率と一致しますね。 厳密には、1ターン目と2ターン目で同じ乱数を引く保証はないので、乱数二発以上の場合この方法では正確な値は求められません。 サイコロを2回投げて合計が10以上になる場合は(6,6)、(5,6)、(6,5)、(4,6)、(5,5)、(6,4)の6通りで、確率は6/36というのが正しい分析ですが、 1回投げて5以上になる確率が2/6だから、(2/6)^2 = 4/36だと分析すると間違えるのと同じです。
確率論というのは本当に難しくて、ダメージ計算機JS-5の際には私も結構苦労しました。 エクセルで横軸をターン、縦軸を残りHPとして、各HPになる確率を求める手法なら正しく計算できると思います。 頑張ってください!
|
Re: 要望・感想スレッド4 ( No.88 ) |
- 日時: 2013/10/20 23:08
- 名前: what?
- 参照: http://note.chiebukuro.yahoo.co.jp/detail/n221693
- >>86,87 SUNさん
素早い返答ありがとうございます。 "1ターン目か2ターン目かどちらか1回だけ攻撃が当たる場合の確率が考慮されていません。"は納得です! また計算式を探してみます。
ところで返信を見ていて"修正した式"のところで気になった点があります。1つは 100 −(( 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 で、答えが73.25%にならないです。私の計算ミスでしょうか?どうしても77.25%になります。
2つ目は、この式は2ターン後の式にすると、乱数の部分が通常時と急所時、両方0/16になるのではないのでしょうか? もしなるとすると、2ターン目以降の計算結果が0%になるんですが…そのへんはどうなんでしょうか?
命中率が80%なのに2ターン目以降の倒せる確率が100%なのはおかしいと思います。 (技のはずれる確率が計算途中にはあるけど、結果に考慮されていない気が…)
あと1つ。 なにか乱数のことで誤解されているような気がするので、もう1度説明します。 知恵ノートにも記載してあると思いますが、私の計算の乱数のところは『本当の意味の乱数』ではなく、ダメージを乱数1つ1つ計算したとき『HP>ダメージ×ターン数』に当てはまるものが幾つあるかを示したものです。つまり乱数が16中の何通り当てはまるかを示したのが、私の計算の乱数です。 なので、"1ターン目と2ターン目で同じ乱数を引くという仮定の元"と言われると、何か違和感を感じます(-_-;)
知恵ノートを編集しましたので、もう一度見てみてください。
|
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になります。 ターン数が多くなるほど無視できない誤差になるため、当サイトの瀕死率では毎ターンのダメージが異なることを再現して作ってあります。
|
Re: 要望・感想スレッド4 ( No.90 ) |
- 日時: 2013/10/21 00:31
- 名前: what?
- 参照: http://note.chiebukuro.yahoo.co.jp/detail/n221693
- >>89 SUNさん
すいません。最後の式が全く解りません。 Σ,nCkは見たことがないので、何を表しているのやら…。(ちなみに私は高2定時制です。確率とは?って、言われると答えられません…。今は、敬語らしき言葉を話すのでやっとです。)
"『HP>ダメージ×ターン数』という式は、毎ターンのダメージが異なれば使えません。 ダメージが異なるなら『HP>ダメージ@ターン1 + ダメージ@ターン2 + ダメージ@ターン3 + ...』こうならなければなりません。"
ホントおっしゃる通りです。やっと自分の計算の違いに気付けてよかったです。説明が非常に解りやすかったです!
ですが、また疑問が生まれたので質問します。 "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" この式についてですが、これは言葉で書くと、どのようになっているのですか? 100-( +((100-80)/100)^2)×100 はわかっているので、残りの解説をお願いします。
|
Re: 要望・感想スレッド4 ( No.91 ) |
- 日時: 2013/10/21 00:32
- 名前: what?
- 参照: http://note.chiebukuro.yahoo.co.jp/detail/n221693
- >>89 SUNさん
たぶん自己解決しました。
100-(『2ターン目2連続命中時の確率』+『2ターン目1回命中1回はずし時の確率』+『1ターン目の確率』+『2ターン目2連続はずし時の確率』)*100
こんな感じの式になっているのでしょうかね?
|
Re: 要望・感想スレッド4 ( No.92 ) |
- 日時: 2013/10/22 03:30
- 名前: SUN
- 参照: http://pokemon-trainer.net/
- what?さんの書き込みの前にちょっと修正してしまいました^^;
Σは総和: http://ja.wikipedia.org/wiki/%E7%B7%8F%E5%92%8C nCkは組み合わせ: http://ja.wikipedia.org/wiki/%E7%B5%84%E5%90%88%E3%81%9B です。 ついでにパスカルの三角形も調べてみるといいかもしれません。
手元に数学の教科書があるならWikipediaより分かりやすい説明があるかもしれませんね。
式は 2回命中する確率: ( 80 / 100 ) ^ 2 2回命中した場合に耐える確率: ( 0 / 16 × 7 / 8 + 0 / 16 × 1 / 8 ) 1回命中する確率: ( 80 / 100 ) × ( ( 100 - 80 ) / 100 ) + ( ( 100 - 80 ) / 100 ) × ( 80 / 100 ) 1回命中した場合に耐える確率: ( 13 / 16 × 7 / 8 + 0 / 16 × 1 / 8 ) 1回も命中しない確率: ( ( 100 - 80 ) / 100 ) ^ 2
※ 10/21 倒せるを耐えるに修正
ですね。
P(nターン以内に倒せる) = Σ[k=1〜n] {nCk × P(命中)^k × P(命中しない)^(n-k) × P(倒せる | k回命中)}
この式はk回の命中で倒せる確率 P(命中)^k × P(命中しない)^(n-k) × P(倒せる | k回命中) に、n回中k回命中する場合の数 nCk を掛けて、kを1からnまで変化させて総和を取るという意味になります。
|
Re: 要望・感想スレッド4 ( No.93 ) |
- 日時: 2013/10/21 00:36
- 名前: SUN
- 参照: http://pokemon-trainer.net/
- 微妙な違いですが、
100-(『2ターン目2連続命中時の確率』+『1ターン目命中、2ターン目回はずし時の確率』+『1ターン目はずし、2ターン目回命中時の確率』+『2ターン目2連続はずし時の確率』)*100
こうですね。
|
Re: 要望・感想スレッド4 ( No.94 ) |
- 日時: 2013/10/21 00:59
- 名前: SUN
- 参照: http://pokemon-trainer.net/
- あっ、この式急所考慮してないですね。
P(nターン以内に倒せる) = Σ[k=1〜n] {nCk × P(命中)^k × P(命中しない)^(n-k) × P(倒せる | k回命中)} P(倒せる | k回命中) = Σ[l=1〜k] {kCl × P(急所)^l × P(通常)^(k-l) × P(倒せる | k回命中, うちl回急所)} P(倒せる | k回命中, うちl回急所) = (k回命中, うちl回急所で瀕死になる場合の数) / (16 ^ k)
これはややこしすぎて泣けますね^^;
|
Re: 要望・感想スレッド4 ( No.95 ) |
- 日時: 2013/10/21 01:37
- 名前: what?
- 参照: http://note.chiebukuro.yahoo.co.jp/detail/n221693
- >>92 SUNさん
SUNさんの説明と、Wikipedia見せてもらいましたが、今のところ、さっぱり解りません…。 教科書も確認しましたが、2つとものってなかったです。 sin,cos,tan,2次関数,因数分解,展開,累乗 等しかのってません…。 高校の教科書だからでしょうか? ちなみに教科書名は『新 高校の数学 I 』。数研出版です。
理解するまでかなりの時間が必要になります(泣)
10ターンまで計算すると四則計算などだけでは、式がとてつもなく長くなるので、プログラム(できればVBA。)でこの式を書けないでしょうか?
>>93,94 SUNさん 修正ありがとうございました!
|
Re: 要望・感想スレッド4 ( No.96 ) |
- 日時: 2013/10/21 01:31
- 名前: SUN
- 参照: http://pokemon-trainer.net/
- >>95 what?さん
数学Aですね。 ここなんか参考になるかもしれません。 http://ja.wikibooks.org/wiki/%E9%AB%98%E7%AD%89%E5%AD%A6%E6%A0%A1%E6%95%B0%E5%AD%A6A_%E5%A0%B4%E5%90%88%E3%81%AE%E6%95%B0%E3%81%A8%E7%A2%BA%E7%8E%87 反復試行の確率というやつです。
これをそのままプログラミングすると計算量がとんでもないことになるので無理ですね。 コンピュータの世界ではオーダー表記を使ってO(N^M)の計算量とかいうのですが、 N=16(乱数の数)、M=10(ターン数)とすると1兆になって多分スパコンでも苦労すると思います笑
なので上のほうでも言っているように残りHPで考えます。 エクセルの縦軸をその残りHPである確率、横軸をターン数にします。 0ターン目は最大HPが1でほかは0ですね。 1ターン目は各乱数のダメージを0ターン目の残りHP(=0ターン目は最大HPしかない)からそれぞれ引いて、その残りHPであった確率×その乱数を引く確率を、ダメージを受けた後の残りHPの部分に足し込みます。 それを10ターン目なり必要なところまで順番に計算していくと完了ですね。 この計算量はO(N*M*L)でL=200(最大HP)とすると32000で、概ねさっきの3000万倍高速に計算できます。
まあプログラムまでは示さないのであとは頑張ってください笑 私もプログラミングを始めたのはwhat?さんくらいの時でしたかねー 懐かしいです。
|