三门问题

昨天优酷土豆笔试考到三门问题,搜了一下。

蒙提霍尔问题,亦称为蒙特霍问题或三门问题(Monty Hall Problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目“Let's Make a Deal”。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。 这个游戏的玩法是:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆车,当参赛者选择一扇门后,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率?如果严格按照上述的条件的话,答案是会。换门的话,赢得汽车的机率是2/3。

问题的答案是可以:当参赛者转向另一扇门而不是继续维持原先的选择时,赢得汽车的机会将会加倍。

  有三种可能的情况,全部都有相等的可能性(1/3)︰
  参赛者挑山羊一号,主持人挑山羊二号。转换将赢得汽车。
  参赛者挑山羊二号,主持人挑山羊一号。转换将赢得汽车。
  参赛者挑汽车,主持人挑两头山羊的任何一头。转换将失败。
  在头两种情况,参赛者可以通过转换选择而赢得汽车。第三种情况是唯一一种参赛者通过保持原来选择而赢的情况。因为三种情况中有两种是通过转换选择而赢的,所以通过转换选择而赢的概率是2/3。

写了个验证程序,换门赢的概率确实是2/3。

#define REP_TIME	10000000
#define GATE_NUM	3

void test4()
{
	srand(time(NULL));
	int gate[3] = {0};

	int right_choice = 0;
	for (int rep=0; rep<REP_TIME; rep++)
	{
		for (int i=0; i<GATE_NUM; i++)
		{
			gate[i] = 0;
		}
		gate[rand()%3] = 1;					//放下礼物

		int choice = rand()%3;				//初始选择
		
		if (gate[(choice+1)%3] == 0)		//换门
		{
			choice = (choice+2)%3;
		}
		else if (gate[(choice+2)%3] == 0)
		{
			choice = (choice+1)%3;
		}

		if(gate[choice] == 1)
		{
			right_choice ++;
		}
	}
	printf("%lf\n",(double)right_choice/REP_TIME);
}


你可能感兴趣的:(游戏,null)