ゲーム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個ならダブルを受けない。