2011年7月31日 ドラクエ先攻確率計算機

僕が昔作った「ドラクエ8先攻確率計算機」が最近一部で話題になっていたようです。
あれはドラクエ8とPS2版ドラクエ5に当てはまる計算式に従い、2005年2月20日に作ったもの。
最近になってこのブログを見ていただいてる方はあんまり興味ないかもしれませんが、
昔はこんなこともやってたんだよという昔話を騙った数学の話をこれからしますので、軽くスルーしてください。

■■素早さ決定システムの前提
(1)あるキャラの素早さをxとする。敵味方の各キャラは戦闘開始時に、「x≧n>x/2」となるnを(ランダムで)取る。但しnは自然数。
(2)戦闘に参加している敵味方全キャラのnを見比べ、数字の大きい順に行動をとる

ここでnを「持ち点」と表現します。
例えば素早さ8のキャラの持ち点は5,6,7,8のどれかになり、素早さ6のキャラは4,5,6のどれかになります。
従って素早さ8 VS 素早さ6では、素早さ8のキャラの方が先攻する確率は高く、前者が5、後者が6を引いた時のみ前者の後攻になります。

また、上記の2つに加えてもう1つ条件を付けますが、これはあくまで「仮定」です。
(3)互いのnが同じ値をとった場合は、どちらが先攻するかの確率は5割/5割になる
例えば上記の素早さ8と素早さ6の例では、互いに5あるいは互いに6を引いた状態がこれに該当します。

■■計算の考え方
これ以降、以下のように○・△・×記号を使って説明していきます。
「素早さが早いキャラがより高い持ち点を得て先攻する」=○
「互いの持ち点が同点になる」=△
「素早さが早いキャラがより低い持ち点を得て後攻する」=×

また、2人のうち素早い方のキャラの素早さをa、遅い方のキャラの素早さをbとします。簡単のためaとbは偶数を仮定します。

■■先攻後攻決定プロセスの数式化
まず素早さ8のAさんVS素早さ6のBさんの例で考えてみます。
各々が取りうる持ち点を取った時の結果を表でまとめます。

次に素早さ10のAさんVS素早さ8のBさんではどうか。

これらの例を元に一般化します。
Aさん(素早さa)のBさん(素早さb)に対する先攻率を出すには、○の数を数えて「○の数と△の数と×の数の和」で割ればいいことになります。
○の数を考えるには、正直に○を数えるよりも、△と×を数えた方が早そうです。

まず最も簡単な△の数から数えます。上の図を見れば図形的にb-a/2であることがわかります。
次に×の数です。
縦に見たときに最も×が多い列は当然一番右端であり、そこに並ぶ×の数は必ず△の総数より1少なくなります。
△の数をtと置くと、×の総数は「1~tまでの総和」、即ち(t-1)t/2であることがわかります。
最後に、○と×と△の合計は、図形全体を長方形としてその面積を考えて(a/2*b/2)となります。

以上より○の個数が出ます。即ち(a/2*b/2)-(t-1)t/2-tです。

■■いよいよ○の数から確率を計算
○の状態になる「確率」Pは、上記を全体の事象数で割って、
P={(a/2*b/2)-(t-1)t/2-t}/(a/2*b/2)と表現できます。
以下展開・整理していきますので、追いたい方は※印を参考にしてみてください。
P={(a/2*b/2)-(t-1)t/2-t}/(a/2*b/2)
={ab-2(t-1)t-4t}/ab ※右辺の分母分子を4倍
=(ab-2t2+2t-4t)/ab ※右辺の分子を整理
=(ab-2t2-2t)/ab ※右辺の分子を整理
=1-(2t2+2t)/ab ※右辺の分子第1項のみ切り離した
=1-(4t2+4t)/2ab ※右辺の残った分母分子を2倍
=1-(2b-a)2/2ab-4(b-a/2)/2ab ※t=b-a/2を代入(∵tは△の個数)
=1-(2b-a)2/2ab-(4b-2a)/2ab ※右辺最終項を整理
≒1-(2b-a)2/2ab ※a,bが十分小さい 大きい時、(4b-2a)/2abは0に近いため近似した

以上より、a>bのとき素早さaのキャラが素早さbのキャラに先攻する確率Pは
P=1-(2b-a)2/2ab

基本的な理論は以上です。
ちなみに展開の最後の近似は、確か頭の中で暗算する際に便利という用途だったと思います。
電車の中とかでぱぱっと計算する際とかに。


但し、以下の疑問点が残ります。
+素早さ8の場合、取り得る値の範囲は5~8か、4~8か。
+素早さが奇数の場合のとりうる値の範囲はどうなるか。
+取った値が同じだったばあいどちらが先攻するのか
僕の予想は「実はnが自然数だけでなく小数点以下も取る」というもの。
逆にそうでない場合は、aとbが小さい時は計算結果がぶれるはずです。

考察ここまで。


最近てかさんという方が実証実験されたようで、
どうやらこの6年前の仮定は大体合っていたようです。
最近こういう地道な調査をする人あんまりいなくなったよね。てかさん調査お疲れ様でした。


追記
ん、もしかしたら途中で近似した理由の1つはパクり防止だったかも。式の導き方を公開しなかったのも。(mixiでこっそり公開してた)
当時極限で調べたことってことごとく他のサイトにパクられていったからね。
一番すごかったサイトは一字一句コピペしたのを「これは私の兄が考えたものです」って言い張ってた。
今でも、RTAのレポートとかで「○○の情報はどこどこのサイトを参考にしました」とか書いてあるものの中に、
それ元々は僕が調べたのになあ…ってのが結構あったりなかったり。
まあ一般論として、そういう環境下では公開する気も失せるよね。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする


コメント

  1. 匿名 より:

    興味深く読ませていただきました。
    先攻後攻決定プロセスの数式化の演算式に誤りがあるようです。
    >>以上より○の個数が出ます。即ち(a/2*b/2)-(t-1)t/2-tです。
    最後の項である-tは△の個数ですが、素早さ決定システムの前提の(3)でnが同じ値をとった場合は、どちらが先攻するかの確率は5割/5割になると定義されてますので、-t/2でなくてはならないかと思います。
    そして式を整理すると(近似をしなくても)P=1-(2b-a)^2/2abとなり、同じ素早さでは先攻率が50%になり違和感がありません。

    余談ですがnは(同値の場合2回判定の必要な)自然数ではなく浮動小数でソートされてると仮定しても、式はP=1-(2b-a)^2/2abとなるため、いずれにせよこの式である蓋然性はとても高いと思われます。

  2. おてう より:

    >noneさん
    あ、ほんとでした。大きい時でしたね。どうもありがとうございます~

  3. おてう より:

    >noneさん
    あ、ほんとでした。大きい時でしたね。どうもありがとうございます~

  4. none より:

    こんにちは。いつも楽しく拝見しております。
    計算式の近似についてコメントにタイプミスがあるようです。
    多分、(4b-2a)/2ab を無視できるのはa,bが十分大きいときではないですか。最初の例で図から数えたときと式で計算したときは結果が割と違います(75%と83.3%)。
    a,bの値が小さいときと大きいときで(4b-2a)/2abを比較すると、例えば
    小:a=8,b=6 -> 1/12
    大:a=30,b=20 -> 1/60
    になります。
    実用的な素早さ範囲では特に問題にならないので無意味な指摘ですけれど…

  5. none より:

    こんにちは。いつも楽しく拝見しております。
    計算式の近似についてコメントにタイプミスがあるようです。
    多分、(4b-2a)/2ab を無視できるのはa,bが十分大きいときではないですか。最初の例で図から数えたときと式で計算したときは結果が割と違います(75%と83.3%)。
    a,bの値が小さいときと大きいときで(4b-2a)/2abを比較すると、例えば
    小:a=8,b=6 -> 1/12
    大:a=30,b=20 -> 1/60
    になります。
    実用的な素早さ範囲では特に問題にならないので無意味な指摘ですけれど…