とあるミッション(三日目)。

(前日からの続き)
勝率の算出方法が間違っているか。
対戦組み合わせをすべて調べ、勝った数を全組み合わせで割った値を勝率とした。ただし、引き分けの時は0.5を加えている。
この引き分けの扱いが間違っているか。実はルールでは、同じ目が出た場合勝負が決まるまでサイコロを振り続けるとある。引き分けという結果は実は存在してはいけない。
仮にサイコロの目が [1, 2, 3] と [1, 1, 1] 同士を対戦させた場合、後者が勝つことは100%ありえない。だが引き分けを0.5として計算すると、後者に勝率がわずかでもあることになってしまう。それは確かに変だ。
まあ取りあえずいいんでね?と適当にやってしまっていた。
計算方法をどう改めればいいだろう?

考えその1
引き分けになる組み合わせを除外するとともに、その分の分母を減らして勝敗を考えればいいか?
[1, 2, 3] と [2, 2, 2] の対決の場合、全ての対戦組み合わせは、
1×2, 1×2, 1×2, 2×2, 2×2, 2×2, 3×2, 3×2, 3×2 分母は9
のところ、引き分けの2×2を消してなかったことにする。
1×2, 1×2, 1×2, 3×2, 3×2, 3×2 分母は6になる。

考えその2
あるいは、対戦で引き分けになる目を最初から戦力外通告する。それもいいのではないか?
[1, 2, 3] と [2, 2, 2] の対決の場合、ダブっている2を除外し [1, 3] と [2, 2] の対決として考える。
1×2, 1×2, 3×2, 3×2 分母は4になる。

早速プログラムを書き替えて試してみる。
だが、両案ともやはりサンプルテストの答と一致しなかった。何がダメなんだろ?
やはり、引き分けを無かったことにするのがいけないのか。考え方を少し変えてみる。

考えその3
求めたい勝率をPとする。
同じ目が出たら、勝負が決まるまで繰り返す。つまり、その場合の勝率はまさしくPであり、そこで加えるべき値は0.5(=引き分け)ではなくPなのではないか。
そのPを求めたいのに、Pが判らないと求められない。あーもしかして永久ループ? 数列の問題なのか?

この考えを式にしてみる。
勝った数をw、引き分けの数をd、面の数をn、勝率をPとする。
当初は引き分け=0.5でカウント、つまり
P = (w + 0.5d) / n^2
で計算していた。この0.5をPに変える。
P = (w + dP) / n^2
この方程式を解いてみる。
n^2P - dP = w
P = w / (n^2 - d)
あれ? なんだかPが求められそうな式になったぞ。
(つづく)

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