ゲーム2
また、ゲーム。
ルール
- 6つの空のマスを用意し、自分からみて左から123456、相手から見ても左から123456と数字を振る。(1つのマスの中の自分と相手の数字を足すと7になる)
- ダブリングキューブを中央に置く。最初のビッドは1とする。
- 交互にサイコロを振る。サイコロを振る前にダブルをかけられる。ダブルを受ける(Acceptする)とビッドは2倍になり、ダブルを受けた方にキューブが行く。キューブのある方にしかダブルはかけられない。ダブルを断る(Rejectする)とダブル前のビッドで負ける。
- サイコロが1,2,3なら、自分の1,2,3のマスにコインを置く。既にコインがあれば勝ち。
- サイコロが4,5,6なら、自分の4,5,6に相手のコインがあれば、取り除ける。
以下は、全48状態の勝率などを出力する。
class Test { private static double Calc(double[,,,] dd, int k, int i, int j, int cc) { double d = 0; // 1 の場合 if (i >= 1) d += 1; else d -= dd[k, j, i+1, cc]; // 2 の場合 if (i >= 2) d += 1; else d -= dd[k, j, i+1, cc]; // 3 の場合 if (i >= 3) d += 1; else d -= dd[k, j, i+1, cc]; // 4 の場合 d -= dd[k, j - (j >= 1 ? 1 : 0), i, cc]; // 5 の場合 d -= dd[k, j - (j >= 2 ? 1 : 0), i, cc]; // 6 の場合 d -= dd[k, j - (j >= 3 ? 1 : 0), i, cc]; return d / 6; } [STAThread] static void Main(string[] args) { // 0 me, 1: center, 2:you double[,,,] dd = new double[2,4,4,3]; int[,,] db = new int[4,4,3]; dd[0,0,0,0] = dd[0,0,0,1] = dd[0,0,0,2] = 1; int k = 0; for (int cnt=0;cnt<1000;++cnt) { int knxt = 1-k; for (int i=0;i<4;++i) // 自分 { for (int j=0;j<4;++j) // 相手 { for (int c=0;c<3;++c) // キューブ { // ダブルしない double d = Calc(dd, k, i, j, 2-c); db[i, j, c] = 0; if (c != 2) // ダブルする { double e = Math.Min(1, 2 * Calc(dd, k, i, j, 0)); if (e > d) { db[i, j, c] = 1; d = e; } } dd[knxt, i, j, c] = d; } } } double f = 0; for (int i=0;i<4;++i) for (int j=0;j<4;++j) for (int c=0;c<3;++c) f += Math.Abs(dd[0, i, j, c] - dd[1, i, j, c]); if (f < 1e-14) break; k = knxt; } //using (StreamWriter sw = new StreamWriter("../../res.txt", false, Encoding.Default)) { for (int i=0;i<4;++i) for (int j=0;j<4;++j) for (int c=0;c<3;++c) Console.WriteLine("Me {0} You {1} Cube {2} Double?={3} Accept?={4} Prob={5}", i, j, c, db[i, j, c] == 0 ? 'N' : 'Y', dd[0, j, i, 2] > 0.5 ? 'N' : 'Y', dd[0, i, j, c]); } } }
- 先手の期待値は、0.142である。つまり、参加費を1個、最初のビッドを7個とすると、期待値は、-0.0056個となる。
- コインの差が1個以上、または共に2個、または共に3個ならダブルする。
- 差が2個以上、または自分が2個で相手が3個ならダブルを受けない。