アサルトエンジンの真の確率を計算してみた

この記事はTRPG Advent Calendar 2021の19日目の記事です。
まだ ←18日目 20日目→ さつこさん「さつこ流「プレイヤーキャラクター」作成のコツ

はじめましての方ははじめまして。定期アドカレの記事とかもしかして読んでくれた人はありがとうございます。普段はTwitterの片隅で一次創作とかTRPGとかをしている六連昴と申します。

さて。普段は細々と身内でTRPGを嗜んでいるのですが、一本布教されて見事に沼にドボンしたシステムがありまして。それがタイトルにもあるアサルトエンジンです。

上記リンクが公式のダウンロードページなのですが、なんとこのシステム、ルールブックがweb上で全編無料公開されており、シナリオも公式からなんと16本も無料提供されているという非常に挑戦的なシステムとなっております。今すぐにでも遊べちゃうんですね。すごい! まあ、全編無料公開ということで広告費もあまり出せずに埋もれているみたいなんですが。

悲しい話はほどほどに。このシステムには一つ独特なルールがあります。それがウィルと呼ばれるゲーム内リソースに関わるルールです。PCたちはこのウィルというリソースを最初から少量持っており、これを仲間の判定に対して「賭ける」ことで増やします。そしてこのウィルを使うことでいろいろと有利な効果を得ることができます。今回の話の主軸となるのはこのウィルの効果の一つ、リロールです。

リロールというのは、文字通り判定のダイスを振り直すことができる効果です。ただし、ただ振り直すわけではありません。アサルトエンジンは100面ダイスを使った下方判定ロールなのですが、リロールで振り直すのはこの判定の十の位または一の位のどちらかだけとなります。また、ゾロ目が出ると、成功率以下の数字であればクリティカルに、成功率より大きい数字であればファンブルになり、以降リロールなどの出目や目標値を操作する効果が使えなくなります。さらに00は0として扱い、さらにゾロ目なため確定でクリティカルとなります。

聞いているだけでうわーってなる方もいらっしゃりそうな複雑さですが、実際やってみるとそんなに難しいことはありません。上記の通り判定にはウィルの増減も懸かっていますので、このリロールの存在は判定のハラハラドキドキが増す効果をもたらしているわけですね。

しかし、そうなると数字で設定されている成功率よりも相当高い確率で成功することがわかるかと思います。リロールは2回まで、かつその2回でそれぞれ違う位を振り直すことはできない(例えば1回目で十の位、2回目で一の位、というのは不可能(注:ルール解釈をミスっていたらしく、実はできました。でももうスプシ組んじゃってるのでとりあえずこの前提で書きます))、という制限はありますが、それでもリロールの存在は相当大きいことでしょう。

そこで私は気になりました。

これ、実際にはどれぐらいの確率で成功するんだろう?

というわけで、実際に計算してみました。


先行研究紹介

早速、と言いたいところですが、その前に少しだけ。実はこの問題、先駆者様がいらっしゃいます。

ただし、こちらの先行研究では、十の位のみを振り直すというレギュレーションで計算を行っています。私もこちらで挙げられている式を使って計算してみましたのが下のグラフとなります。

スクリーンショット (598)
先行研究の式に基づいたグラフ

十の位が上がるところがボコッとなっていますね。これは十の位のみを振り直す都合上、十の位が上がれば当然成功確率が上がるためです。しかし、十の位がそんなに大きくなくて一の位が大きい、例えば38%の場合などでは一の位の振り直しも少ないとはいえ無視できない確率存在するでしょう。これにより、このボコッはおそらくある程度の解消が見込めます。

また、8割を超えて高確率になってくると再び一の位の振り直しの重要度が上がってきます。特に、9割を越えると振り直すとしたら一の位になるため、この計算では不正確です。

今回の計算ではこの辺りの問題点を解消していきます。

やってみよう

まず完成品

とりあえず最初に出してしまいますが、完成したものがこちらになります。

1枚目の目標値の欄に十の位と一の位を分けて突っ込むと確率が出ます(編集権限はオープンにしていないので、手元にコピーしていじってください)。2枚目は計算用データシートで、3枚目に全データを並べてグラフに突っ込んだものがあります。画像を貼るとグラフはこんな感じ。

今回出した式に基づいたグラフ

概ね同じ形ですが、凹凸がはっきりと、しかしなだらかになっているようです。では、実際にどうやってこのグラフを出したか見ていきます。

リロールなしのとき

まず、リロールなしで振って成功する確率を計算します。今後の計算のため、目標値の十の位を$${a}$$、一の位を$${b}$$、a, bを数字のように扱って目標値$${ab}$$と書いたとき、リロールn回で成功する確率を$${P(ab, n)}$$、失敗する確率を$${Q(ab, n)}$$、ファンブルする確率を$${R(ab, n)}$$と置くことにします。アサルトエンジンでは00が0扱いとなり、絶対成功であるため、リロールなしで振って成功する確率$${P(ab, 0)}$$は、$${10a+b+1}$$ [%]となります。ここまでは簡単ですが、ここからが問題です。

今回この問題を解くために、

・最初に振った時の出目で考えて、振り直したときの成功確率が高い方を振り直すものとする
ex. 目標値46%のとき、出目が56であれば上を、49であれば下を振り直す
・サクセス(ウィルを消費して目標値を上げる効果)は使用しない

とします。この条件では、どういうときにどういう出目が出たらどこを振り直し、どれだけの確率で成功/失敗/ファンブルするか、というのがはっきり決まります。そして、素目で成功する確率は「最初に振った時に成功する確率」、一回目のリロールで成功する確率は「最初に振った時に失敗する確率」×「リロールしたとき成功する確率」、二回目のリロールで成功する確率は「最初に振った時に失敗する確率」×「(一回目に)リロールしたとき失敗する確率」×「(二回目に)リロールしたとき成功する確率」となります。つまり、「最初に振った時に成功/失敗/ファンブルする確率」「リロールしたとき成功/失敗/ファンブルする確率」を出して、適切なものを掛け算すればそれぞれの確率が出るはずです。

というわけで、まず出すべきは「最初に振った時に成功/失敗/ファンブルする確率」ですね。成功する確率は先程出しましたので、失敗(notファンブル)する確率とファンブルする確率を求めましょう。クリティカルは成功と分ける必要がない(成功だろうがクリティカルだろうがそれ以上振り直さないことは同じ)ため今回は考慮しません。

アサルトエンジンにおけるファンブルの定義から、まず「十の位>一の位」なのか「十の位≦一の位」なのかで場合分けが必要なことがわかります。なぜならば、十の位が目標値の十の位とぴったり同じときのゾロ目がクリティカルになるのかファンブルになるのかがこれで決まるからです。

「十の位>一の位」のとき、十の位が目標値の十の位とぴったり同じときのゾロ目はファンブルなので、ファンブルとなる出目は10a+a, 10(a+1)+a+1, …, 99。よってファンブルになる可能性がある出目9個(11, 22, …, 99)からクリティカルとなる出目の数a-1個(11, 22, …, 10(a-1)+a-1)を引けばいいので、リロールなしでファンブルする確率$${R(ab, 0)}$$は、$${10-a}$$ [%]となります。「十の位≦一の位」のときはファンブルになる出目が1つ減るので$${9-a}$$ [%]です。失敗する確率$${Q(ab, 0)}$$は、全体の確率(100%)から$${P(ab, 0)}$$、$${R(ab, 0)}$$を引けばいいので、$${100-P(ab, 0)-R(ab, 0)}$$ [%]となります。

リロールがしたい

では、「リロールしたとき成功/失敗/ファンブルする確率」の方を求めましょう。これは見かけよりも難しいです。というのも、先程ひとくくりに「失敗する確率」として出した$${Q(ab, 0)}$$を場合分けしなければならないからです。どのように場合分けするかというと、

  • 上の位をリロールしたほうが成功確率が高い、かつファンブルが発生しうる

  • 上の位をリロールしたほうが成功確率が高い、かつファンブルが発生しない

  • 下の位をリロールしたほうが成功確率が高い

の3種です。この条件で、リロールしたときの成功/失敗/ファンブルの確率が変わってきます。ので、どのように変わってくるかを解説しつつそれぞれを条件式に落とし込んでいきます。

まず、上下どちらを振り直したほうが成功確率が高いのか。これは単純に、目標値の十の位と一の位を比べればいいですね。リロールというのは、0~9の10個の値が出るダイスを振って、0~9のいずれかの値に設定された目標値以下を出す行為なので、単純に目標値が高い方、すなわち目標値の十の位と一の位を比較し、高い方を振り直したほうが成功率は高いです。ただし、例えば目標値46、達成値が68のときに、一の位を振り直して6以下にしても成功はしません。つまり、そもそも一の位の振り直しが有効なのは達成値の十の位が目標値の十の位以下、もっと言えば十の位とぴったり同じときのみとなります(「目標値の十の位>達成値の十の位」だったら判定はそもそも成功してますからね!)。したがって、

上の位をリロールしたほうが成功確率が高い
目標値の十の位>目標値の一の位
かつ目標値の十の位=達成値の十の位
または
目標値の十の位<達成値の十の位

下の位をリロールしたほうが成功確率が高い
目標値の十の位≦目標値の一の位
かつ目標値の十の位=達成値の十の位

※目標値の十の位>達成値の十の位のとき、判定はそもそも成功している

こうなります。

ちなみに特殊な状況として、「目標値の十の位=(目標値の一の位)+1、かつ目標値の十の位=達成値の十の位」のとき、上を振り直しても下を振り直しても確率が一致します(ex. 目標値43、達成値46)。後述するファンブル可能性を考慮しても一致するので、簡単のため上をリロールする方に入れることとします。

また、しれっと言っていますが、ここでリロール前の達成値を考慮に入れる必要が出てきました。達成値は00~99の100種類あるので、それぞれについて丁寧丁寧丁寧に計算するのは無理です。なので、この達成値のうち、まず失敗(notファンブル)のものを抽出し、先に上げた3種の場合分けに突っ込むことで、計算量を軽くしています。スプシではデータシートに全達成値を打ち出してCOUNTIFSで条件に合う達成値の数を数え上げています。力業です。文明の利器バンザイ。

で。次にファンブルについて考えましょう。上下どちらをリロールするか決めてからダイスを振る場合、出た目によってはファンブルが発生しえます。例えば目標値が36、達成値が67だったとき、上を振り直して7が出れば、達成値が77になってしまいファンブルとなります。が、達成値が63であれば、33は目標値以下なのでクリティカルとなり、上を振り直してもファンブルにはなりません。また、達成値が37で下を振り直すとしても、33はクリティカルなのでファンブルにはなりません。もう少し例を出しましょう。目標値が50、達成値が65だと、上を振り直して5が出れば55でファンブルです。達成値が82であれば、22はクリティカルなので上を振り直してもファンブルにはなりません。

目標値36、達成値67→77(上)でファンブルあり
 〃   達成値63→33(上)でファンブルなし
 〃   達成値37→33(下)でファンブルなし
目標値50、達成値65→55(上)でファンブルあり
 〃   達成値82→22(上)でファンブルなし

ベタ打ちだと例がわかりにくすぎたのでまとめました。

この例から考えると、「目標値の十の位<達成値の一の位で上を振り直した」とき、ファンブルが起こりそうです。また、「目標値の十の位=達成値の一の位」のときにどうなるかは、目標値の十の位と一の位の大小関係に依存しそうですね。そして、下を振り直したときのファンブルは考慮しなくても良さそうです。

では、振り直してファンブルする確率を条件式に落とし込んでいきますが、そのままでは複雑すぎるので、まずファンブルを条件式で定義します。

達成値の十の位=達成値の一の位
かつ目標値の十の位≦目標値の一の位
かつ目標値の十の位<達成値の十の位
または
達成値の十の位=達成値の一の位
かつ目標値の十の位>目標値の一の位
かつ目標値の十の位≦達成値の十の位

これがファンブルの条件式による定義です。ゾロ目がクリファンなので「達成値の十の位=達成値の一の位」は絶対必要、「目標値の十の位=達成値の十の位」のときがファンブルか否かを考えるために目標値の十の位と目標値の一の位を比べる必要があるため、このような条件づけになります。そして、上を振り直すと「達成値の十の位」が変化し、下を振り直すと「達成値の一の位」が変化します。

これでファンブルが条件式になったので、まず下を振り直したときのファンブルについて見てみます。下を振り直すときは「目標値の十の位≦目標値の一の位、かつ目標値の十の位=達成値の十の位」のときでした。比較すれば一目瞭然ですが、この条件がまずファンブルの条件に合致しません。そして下を振り直すことによって変動する「達成値の一の位」が下を振り直す条件に含まれないので、下を振り直してもファンブルの条件に合致することはありません。なので、下を振り直してもファンブルが起きることはありません。先程述べた特殊な条件下では下を振り直してもファンブルしますが、この条件では上を振り直すことにしたので無問題です。

では、上を振り直してファンブルするときはどういうときでしょう。上を振り直すときは「目標値の十の位>目標値の一の位かつ目標値の十の位=達成値の十の位」または「目標値の十の位<達成値の十の位」でした。この前者、「目標値の十の位>目標値の一の位かつ目標値の十の位=達成値の十の位」のときは、「目標値の十の位≦達成値の一の位」を満たせばファンブルします。なぜならば、振り直す前は判定が失敗していますから、「目標値の一の位<達成値の一の位」のはずです。また、クリファンの条件は「達成値の十の位=達成値の一の位」です。「達成値の十の位」は振り直しで変動しますが、それ以外は変動しないので、「目標値の十の位>目標値の一の位」はそのまま使えます。これらの条件を使って、「目標値の十の位」と「達成値の一の位」の大小関係による場合分けをすると、

目標値の十の位>達成値の一の位のとき、
目標値の十の位>達成値の十の位=達成値の一の位>目標値の一の位
→判定は成功しており、クリティカル

目標値の十の位≦達成値の一の位のとき、
達成値の十の位=達成値の一の位≧目標値の十の位>目標値の一の位
→判定は失敗しており、ファンブル

となります。なのでこの条件でファンブルします(数学的に厳密な証明にはなってないと思います。怒らないで!)

では、上を振り直す条件の後者、「目標値の十の位<達成値の十の位」のときはどうか。このときは単純ではなく、さらに場合分けが必要です。なにで場合分けするかというと、「目標値の十の位」と「目標値の一の位」の大小関係を使います。なぜならば、「目標値の十の位=達成値の十の位」となったときにファンブルか否かがこれで決まるからです(振り直す条件と矛盾しているように見えますが、振り直す条件は振り直す前の達成値、これは振り直した後の達成値を参照しているので矛盾はしていません)。「目標値の十の位≦目標値の一の位」であれば「目標値の十の位=達成値の十の位」はクリティカル、「目標値の十の位>目標値の一の位」であれば「目標値の十の位=達成値の十の位」はファンブルとなります。そして、またしても「目標値の十の位」と「達成値の一の位」を比較するのですが、「目標値の十の位>目標値の一の位」のときは上記と変わらず「目標値の十の位≦達成値の一の位」でファンブルします。しかし、「目標値の十の位≦目標値の一の位」のときは、「目標値の十の位=達成値の一の位」ではファンブルしなくなります。これは、先に出てきた「目標値の十の位=達成値の十の位」がファンブルか否かと関わりがあります。この2つの等式をつなげると「達成値の十の位=達成値の一の位」となり、これはまさにクリファンの条件式です。そして、このときファンブルでないのだから、つまり「目標値の十の位=達成値の一の位」のときはファンブルでないと言えますね。これらをまとめると、

目標値の十の位<達成値の十の位のとき、
目標値の十の位≦目標値の一の位
かつ目標値の十の位<達成値の一の位
または
目標値の十の位>目標値の一の位
かつ目標値の十の位≦達成値の一の位
でファンブルする可能性ができる

となります。よって、上を振り直したときにファンブルが起こる条件式は、

目標値の十の位>目標値の一の位
かつ目標値の十の位=達成値の十の位
かつ目標値の十の位≦達成値の一の位
または
目標値の十の位≦目標値の一の位
かつ目標値の十の位<達成値の十の位
かつ目標値の十の位<達成値の一の位
または
目標値の十の位>目標値の一の位
かつ目標値の十の位<達成値の十の位
かつ目標値の十の位≦達成値の一の位

よく見ると、上から1つ目と3つ目はほぼ同じ条件であることがわかりますね。まとめてしまいましょう。

目標値の十の位>目標値の一の位
かつ目標値の十の位≦達成値の十の位
かつ目標値の十の位≦達成値の一の位
または
目標値の十の位≦目標値の一の位
かつ目標値の十の位<達成値の十の位
かつ目標値の十の位<達成値の一の位

以上を踏まえて、スプシにつっこむために扱いやすいように場合分けしたものが以下です。

目標値の十の位≦目標値の一の位のとき

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がある
目標値の十の位<達成値の十の位
かつ目標値の十の位<達成値の一の位

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がない
目標値の十の位<達成値の十の位
かつ目標値の十の位≧達成値の一の位

下の位をリロールしたほうが成功確率が高い
目標値の十の位=達成値の十の位

目標値の十の位>目標値の一の位のとき

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がある
目標値の十の位≦達成値の十の位
かつ目標値の十の位≦達成値の一の位

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がない
目標値の十の位≦達成値の十の位
かつ目標値の十の位>達成値の一の位

下の位をリロールしたほうが成功確率が高い
なし

これで場合分けが終わった! ……かと思いきや、実は終わっていません。リロールの成功条件が一意になってくれないのです。リロールの成功条件は単純に「目標値の(振り直す方の桁)≧達成値の(振り直す方の桁)」でいい……というわけではありません。例えば、目標値41、達成値63のとき。このときは上を振り直すことになりますが、リロールのd10で4が出ても達成値43で失敗となります。場合によって「目標値の(振り直す方の桁)≧達成値の(振り直す方の桁)」のときと「目標値の(振り直す方の桁)>達成値の(振り直す方の桁)」があるわけですね。この区別には「目標値の(振り直さない方の桁)」と「達成値の(振り直さない方の桁)」の大小関係を使います。下をリロールするときは必ず「目標値の十の位=達成値の十の位」なので、「目標値の一の位=達成値の一の位」のときは成功になります。なので、成功条件は「目標値の一の位≧達成値の一の位」です。問題は上を振り直すときで、

  • 「目標値の一の位<達成値の一の位」→「目標値の十の位>達成値の十の位」

  • 「目標値の一の位≧達成値の一の位」→「目標値の十の位≧達成値の十の位」

になります。

しかし、これは全パターン場合分けする必要はありません。「目標値の十の位≦目標値の一の位のとき、上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がない」場合、条件から必ず「目標値の一の位≧達成値の一の位」になります。さらに、「目標値の十の位>目標値の一の位のとき、上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がある」場合、同じく条件から必ず「目標値の一の位<達成値の一の位」となります。なので、そうではないところを場合分けしてやれば大丈夫です。したがってこうなります。

目標値の十の位≦目標値の一の位のとき

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性があり、リロールの成功条件が「目標値の十の位>達成値の十の位」
目標値の十の位<達成値の十の位
かつ目標値の十の位<達成値の一の位
かつ目標値の一の位<達成値の一の位

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性があり、リロールの成功条件が「目標値の十の位≧達成値の十の位」

目標値の十の位<達成値の十の位
かつ目標値の十の位<達成値の一の位
かつ目標値の一の位≧達成値の一の位

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がない(リロールの成功条件は「目標値の十の位≧達成値の十の位」)
目標値の十の位<達成値の十の位
かつ目標値の十の位≧達成値の一の位

下の位をリロールしたほうが成功確率が高い(ファンブルなし)
目標値の十の位=達成値の十の位

目標値の十の位>目標値の一の位のとき

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がある(リロールの成功条件は「目標値の十の位>達成値の十の位」)
目標値の十の位≦達成値の十の位
かつ目標値の十の位≦達成値の一の位

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がなく、リロールの成功条件が「目標値の十の位>達成値の十の位」
目標値の十の位≦達成値の十の位
かつ目標値の十の位>達成値の一の位
かつ目標値の一の位<達成値の一の位

上の位をリロールしたほうが成功確率が高く、ファンブルの可能性がなく、リロールの成功条件が「目標値の十の位≧達成値の十の位」
目標値の十の位≦達成値の十の位
かつ目標値の十の位>達成値の一の位
かつ目標値の一の位≧達成値の一の位

下の位をリロールしたほうが成功確率が高い
なし

これに念の為目標値<達成値(失敗の定義)を加え、ファンブルとなる出目を抜いて数え上げを行い、それぞれのパーセンテージを出します。

リロールをしよう

やっとリロールができます。やったー! 先程の場合分けによって、それぞれのときに成功/失敗/ファンブルする確率が出せるようになりました。力尽きてきたので結果だけ……。

上を振り直し、リロールの成功条件が「目標値の十の位>達成値の十の位」
10a [%]

上を振り直し、リロールの成功条件が「目標値の十の位≧達成値の十の位」
10(a+1) [%]

下を振り直す
10(b+1) [%]

ご無沙汰なのでもう一度書いておくと、目標値の十の位をa、一の位をbと置いていました。この確率は何度振り直しても変わりません。よって、

  • 素目で成功する確率は「最初に振った時に成功する確率」

  • 一回目のリロールで成功する確率は「最初に振った時に失敗する確率」×「リロールしたとき成功する確率」

  • 二回目のリロールで成功する確率は「最初に振った時に失敗する確率」×「(一回目に)リロールしたとき失敗する確率」×「(二回目に)リロールしたとき成功する確率」

より、最終的な確率が出ます。ここまで数字で出している確率はすべて百分率なので、100で割ってから使うのをお忘れなく。

これで計算できました! やったー!

目標値0~50の範囲のグラフ

できたグラフを眺めてみます。やはり見かけよりも随分成功しやすいですね。目標値40を超えたあたりで2回リロールの成功率が75%を超えています。初期作成PCの技能成功率は30ちょっとぐらいが多いですが、このへんでも7割載るか載らないか程度の成功率です。多くのシステムで7割~8割で成功する判定はよく用いられていますから、この確率はゲームデザイン的にかなり妥当なのではないでしょうか。

道中ぼこぼこしているところはちょうどゾロ目の場所のようです。ゾロ目が成功の領域に載るとファンブルの確率が減りますから、納得できますね。

ちなみに、これはサクセスを考慮していないので、下を振り直す状況の殆どはサクセスで済む、ゾロ目付近だと先行サクセスでゾロ目をクリティカルにしてから振り直すなどの小技が使える以上、実際に「成功」している割合でいくと多分もうちょっとなだらかになるんじゃないかな。

いかがでしたか?

はい。遅刻しております。これを書いているのが20日の朝4時です。最後の方は力尽きて色々と説明を端折っているし、その直前は量はあるのにレイアウトに気を使ってないから文章が団子みたいになっております。不親切か?

スプシ作ってるときもたいへんだったけど、この記事を書き始めたのはスプシを作ってからだいぶ経ってからなので自分のスプシを解読するのがまた大変だった(ダメじゃん)(ちゃんとメモをつけようね!)。しかも、ちゃんと解説を書いてみると結構ガバっており、記事を書きながらスプシも直していました。おかげで死ぬほど時間がかかってしまった……。

とまあ、ここまで確率を検証してきましたが、ぶっちゃけ言うと、

>>>アサルトエンジンは確率気にして遊ぶゲームじゃないです<<<

なんとなく成功するか失敗するかわからないハラハラドキドキ、当たったときの高揚感、ぶっちゃけ博打。そんな感じで楽しむゲームなので、上に書いてあることがちんぷんかんぷんでも遊べます。大丈夫。アサルトエンジンはいいぞ! アサルトエンジンをやれ! 異能力持ちの思春期学生RPができるぞ!! たのしいぞ!!

なお、これを書いている人は別にプロでもなんでもないので、間違ったことを書いている可能性があります。もし何かに気づいたらご指摘いただけると幸いです。

この記事が気に入ったらサポートをしてみませんか?