アサルトエンジン リロールの確率について

 グループSNEの新作ゲームにアサルトエンジンというのがある。先日、遊んでみたのだけど、独特の判定ルールがあり、確率計算をしてみるのも面白そうだと思った。
 先日アップしたものは計算間違いを発見したため破棄して改めて書き直した。書き直している最中にPCが壊れたりして結構大変でした。

 アサルトエンジンでは判定方法にD100により目標値以下となった場合成功としている。ただし、D100の出目が00のときの値は0とするため、成功率は目標値よりも1%増える。また、D100はD10を2つ振って100%ダイスとする。
 判定はゾロ目のときにファンブルかクリティカルとなる。目標値以下でのゾロ目がクリティカルで、目標値より高い出目でのゾロ目がファンブルとなる。クリティカルした場合は判定は成功。ファンブルは失敗。2つのD10がゾロ目になった時点で判定は終了であり、後述のウィルは使えない。
 アサルトエンジン特有のルールとしてウィルというポイントがある。初期作成キャラの場合、ウィルは6点持っており、これは増減する。また、ラストウィルというポイントが10点あり、これはウィルと同様に使える。ここでの計算においてはウィルとラストウィルの違いを明示する必要性がないので合わせて16点と考える。
 ウィルは初期作成時最大で22点まで増やすことができる。22点を超えた分は切り捨てられる。ラストウィルと合わせて32点となるので、本計算においてはウィル16点/最大32点とする。

ウィルの使用方法
 判定に於いてウィルの使い方は3通りである。
・達成値を1上げる
 判定者がウィルを使い達成値を上げる。1点消費する毎に達成値が1伸びる。使用するウィルの数に制限はない。使用のタイミングは判定の直後、あるいはダイス目を入れ替えた直後となる。
・リロール
 他のプレイヤーがウィルを1点消費して1D10を振り、判定者の振ったD10のどちらかと入れ替える。振ったダイスは必ず入れ替えなければならない。このやり直しは2回まで行える。
・ベット
 他のプレイヤーが判定前にウィルを賭け、判定が成功したら賭けたウィルが2倍になって返ってくる。これをベットと呼ぶ。賭けられるウィルの数に制限はない。ベットできるのは判定の前である。

確率の計算
 リロールによって成功確率は大きく変わる。確率計算においては取り敢えず、判定をやり直さない、1回やり直す、2回やり直す、と3パターンに場合分けして考える。ただし、2回やり直す計算は複雑になるため、今後やる気があったら計算することとする。また、判定をやり直さない場合は成功率は"P+1"%となることが計算するまでもなく分かる。結局、今回は1回振り直すことによってどう確率が変わるかを報告する。
 計算する上で、数値を以下のように文字として表記する。

P:目標値(099、10P10+P1)
P1:目標値の1の位(09)
P10:目標値の10の位(09)
A:達成値(099、10A10+A1)
A1:ダイス目の1の位(09)
A10:ダイス目の10の位(09)
B:賭けたウィルの数
F:ファンブルする確率(%)
R:リロール率(%)
R1:リロール1回目の成功率
R2:リロール2回目の成功率
D1:リロール1回目のダイス目(09)
D2:リロール2回目のダイス目(09)


ファンブルする確率について
 ファンブルとなる確率は次の通りである。

P 確率(%)
0~109
11~218
22~327
33~436
44~545
55~654
66~763
77~872
88~981
990

上表を数式で表すと、
    ファンブル率F = 9-[P/11]%
となる。ただし[]は床関数。

リロール率Rについて
 リロールする場合は、判定による結果が目標値より高く、かつファンブルでない場合のみに限られる。取り敢えず、リロールを行う確率を一般的に求めたい。
 達成値が目標値よりも高くなる確率は(99-P)%である。ここからファンブル率を引くことで得られる。

 リロール率R = (99-P)-(9-[P/11]) = 90-P+[P/11]

となる。

 確率計算についてだけど、細かく場合分けして、シグマで積算したら解が得られるかと期待したが、ちょっと手に負えなさそうだったので諦めた。次に、プログラムを使って計算しようと考えた。これなら確実に解が得られるし、大まかなロードマップも描けている。とはいえ、長らくプログラミングを行っていないので「勉強しながらコードを書くのか、面倒だなぁ」とか思うわけでした。昔書いたGaussianの出力からの座標抽出プログラムを書き換えて作ろうかなとちょびちょび書いてみたのだけど、同時に成功、失敗、ファンブル、リロールのマッピングを行いたいなと思い、エクセルで書いていたら、エクセルで確率計算も一緒に行けるんじゃね? とか思い至ったわけでした。
 そんなわけで、取り敢えずリロール1回についてはエクセルで解いた。その際、面倒な場合分けは殆ど排除した。
 あと、2つのPCでデータを送り合って作ったのだけど、入っているエクセルのバージョンが違う。一方はExcel2000で一方はOffice2010に入っているバージョン14とかいうもの。ファイルの保存形式が違うため出力結果が微妙に違うという困った現象が起こった。具体的にはExcel97-2003ブックという拡張しが".xls"となっているファイルは256行しか表を作れないという所為で非常に面倒な目を見た。何せ10000行まで使う計算なので。
 結局、場合分けはリロールするかどうかという点だけ行い、後は総当たりで書いた。そのためセルの中が次に示すように悲惨なことになってしまった。

=F114*((($F$2*10+F$218)<=$B221)+*1/10

 ↑これが100×100セルある。ソースコードを書いているとよくあることだけど、一度書いてしまうと二度と読み返して理解できないというダメなコマンドの例とも言える。
 後になって思えば、どうせ総当たりで計算するのならリロールするかどうか、ではなく、成功およびファンブル以外、として計算した方が良かったと思う。
 とにかく、書いてしまったのでもう触らないようにして後はアップするだけとした。

マッピングについて
 成功、失敗、ファンブル、リロールのマッピングを行った。
 リロールに至るフローチャートは次の通りでこのチャートに従ってエクセルで計算して表を作った。



 計算する前の段階ではマッピングしたときの形は表を対角線に分割して三角形と縦線が出てくる様な形になるなと予想を立てたところ、大体予想通りとなった。
 

 マッピングを作ったので、次は確率を計算する。
 確率は上のマッピングでリロールするとなった座標に於いて、10桁と1桁のどちらかに0~9の数値を代入したときに何個成功するかを数えて10で割った。この結果を100×100のマスに入れて、目標値毎に積算することで確率を出した。
 目標値毎の成功率は次の図の通り。

 ベットしたウィルが還元される期待値は

判定成功率×ベット-リロールのウィル1点×リロール率×ベット-始めに賭けたベット
  =(P+1)/100×B-R+(リロール成功率)×B-B
  =((P+1)/100+(リロール成功率)-1)B-R

とかなりそう。

 リロールする際の成功確率について、エクセルでの計算結果の100×100のマトリクスをプリントアウトして数値を眺めているとどの領域がどういう確率になるか見えてくる。次のように表現できる。


 ①P10=A10 ∩ P1≧P10 のとき (P1+1)/10
 ②P10=A10 ∩ P1<P10 のとき P10/10
 ③P10≠A10 ∩ P1≧A1 のとき (P10+1)/10
 ④P10≠A10 ∩ P1<A1 のとき P10/10

 色々こねくり回した結果上の場合分け表示を得たが、敢えてこういった表記を明示しなくてもある程度数学的思考のできる人ならリロールする際に本能的に計算することと思う。
 この表記を明確に認識していたら上のエクセルのマスももう少しスマートに表示できたのになぁ、と思う。検討開始時の僕の中ではP10=A10のときに変なことになるということは認識していたのだけど、そこから先を考えると考えがぐちゃぐちゃになって上手くまとまらなかったので総当たりに逃げ込むことになった。
 一応、上記の①④の条件で上手く計算できることをエクセル上で検算したのでこれで行ける。2回目のリロールを計算する際には場合分けが役に立つ。

 次に2回目のリロールについて計算する。
 リロール1回では判定直後の全てのパターンで成功の可能性があるわけではなく、マッピング図の赤い部分とファンブルのときは成功の目がない。一方、2回のリロールを行うことで、各桁のダイス目を変更することができるので、ファンブル以外の全ての出目に対して成功の可能性が出てくる。
 2回目のリロールを考える際に、マッピング図の緑の領域と赤の領域を分けて考えることにした。1回目のリロールで緑の領域で失敗した場合、2回目のリロールの際も目標値は変わらない。一方の桁では成功しており、もう一方の桁では失敗しているという状態に変わりはないためである。また、ファンブルの目は既に出ている同じ目のダイスと交換することで変化しなかったとすることができる。
 そういうわけで、前回に示したリロール1回の成功率から、逆に失敗率を計算して、そこに成功率を掛けたら2回目の成功率は導くことができる。

 緑の領域での2回目リロール成功率=(1-R1)*R1

 だいぶ低い値になりそうではあるが、確率の分母が判定直後でありリロール1回目で失敗した場合に限っているのでそれは仕方ないかと思う。あと、2桁と2桁のかけ算なので3桁になって表が鬱陶しいことこの上ない。
 緑の領域はこれで終了。

 次は本題の赤の領域。
 赤の領域では1回目と2回目のリロールでどちらも成功しないといけないので確率は低くなる。
 ここではD10を2回振ってその結果によって成否が決まるので、前回みたいに総当たりを試みるのはあまり現実的ではない。仕方ないので真面目に確率を検討する。
 結局のところ、この作業はスワップロールの成功率を求めることと等しい。スワップロールとは真・女神転生RPGで行っていた10面体の1の位と10の位を入れ替えるというロールシステム。
 スワップダイスの成功確率については別のエントリーで求めてあるのでそのまま使う。

P10≧P1のとき
 -P102 + 20P10
P10<P1のとき
 100 - (9 - P10)2 - 2(9 - P1)

 この式をエクセルにぶち込んでやれば完成である。
 結局下図となった。

 図の通り、目標値20くらいで成功率は五分五分になる。
 リロール2回目は1回目のときみたいにファンブルの影響が見られない。
 このゲーム、初期作成時で各キャラ得意科目での判定の目標値が3040くらいなので、2回のリロール前提で考えれば成功率は70%を超える。ベット(賭け)とはいうものの圧倒的に有利な条件で賭け事ができるので、より多く賭けた方が優勢になる。ただし、ファンブルが起こると親の総取りみたいなことになるので、後先考えずに賭けるのも考え物である。ファンブルが起きても大丈夫程度により多く賭けるのが正しい賭けかたなのかな。


 リロール2回目の計算は、意外とすんなりできた。リロール1回目の計算の最後で4つの条件に収束させたことと、スワップダイスの概念を取り入れたことが大きいかなと思う。おかげで障害となるのがエクセルとはてなブログの使い勝手の悪さだけとなった。はてな記法とかどうでもいいのでHTMLで表記したとおりに表示して欲しい。
 ついでに、計算に使ったエクセルファイルとまとめPDFを上げておく。
エクセル(2.25MB):http://www.mediafire.com/?2c2b7hnpad5491f

20181116 追記
 はてなブログ以降につき表記を修正しようとしましたが、はてな記法とやらの暴走のせいで上手く表示させることができませんでした。
 また、エクセルの表記についてはいまならもうちょっとスマートな書き方ができると思いますが、そのままにしておきます。

20201109 追記
 スワップダイスの計算について間違いを見つけたので修正しました。

関連エントリー
 20201108 スワップダイスの確率
 20150412 ウタカゼ 判定の達成値
 20150807 ドラスレ確率計算
 20150722 ドラスレ遊んだよ
 20150516 でたとこサーガ 判定の達成値と確率について
 20150505 でたとこサーガ遊んだよ
 20140531 複数のダイスを振ったときの出目の合計が任意の値となる確率


*1:$F$2*10+F$218)>$B221)*((F$217*10+$F$2)<=$B221)+(($G$2*10+F$218)<=$B221)+(($G$2*10+F$218)>$B221)*((F$217*10+$G$2)<=$B221)+(($H$2*10+F$218)<=$B221)+(($H$2*10+F$218)>$B221)*((F$217*10+$H$2)<=$B221)+(($I$2*10+F$218)<=$B221)+(($I$2*10+F$218)>$B221)*((F$217*10+$I$2)<=$B221)+(($J$2*10+F$218)<=$B221)+(($J$2*10+F$218)>$B221)*((F$217*10+$J$2)<=$B221)+(($K$2*10+F$218)<=$B221)+(($K$2*10+F$218)>$B221)*((F$217*10+$K$2)<=$B221)+(($L$2*10+F$218)<=$B221)+(($L$2*10+F$218)>$B221)*((F$217*10+$L$2)<=$B221)+(($M$2*10+F$218)<=$B221)+(($M$2*10+F$218)>$B221)*((F$217*10+$M$2)<=$B221)+(($N$2*10+F$218)<=$B221)+(($N$2*10+F$218)>$B221)*((F$217*10+$N$2)<=$B221)+(($O$2*10+F$218)<=$B221)+(($O$2*10+F$218)>$B221)*((F$217*10+$O$2)<=$B221