C语言简单代码速解蒙提霍尔问题(三门问题)

在蒙提霍尔游戏节目中,让你在三扇关着的门中选择,知道一扇门后面是跑车,其他俩都是山羊,当然希望选中赢的是跑车。当你选择后告诉他,比如说1号(中奖情况你不知道),主持人知道车在什么地方,他打开另外一扇门,比如说3号,是羊在那儿。然后问你,要不要改主意选2号。问:改选是不是更有利?

乍一看大家会觉得三门问题难以理解,但是实际上只要简单假设就能轻松理解。

首先我们假设我们每次选择后,在主持人开另一扇山羊的门后我们都会更换门的选择。

现在我们抛开门,我们输的情况是怎样的?(在每次都换选择的情况下)

答案是唯一的,就是我们一上来就选中了跑车的门,这时候我们就输了,更换后是山羊的门。

这样来算,在我们每次都更改选择的条件下,我们输的概率只有1/3。其他都是赢的情况。主持人的选择并不需要参与程序的运行。因为,在必换门的情况下,输赢只跟我们一上来的选择有关系。

理解了以上内容,C语言实现便十分简单。

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>

void statistic()
{
    static int sum = 0, lose = 0, success = 0;

    //初始化奖池
    int num_prize = rand() % 3 + 1;

    //玩家做出选择
    int player_choose = rand() % 3 + 1;

    //
    if (player_choose == num_prize)
    {
        ++lose;
        ++sum;

        printf("有效次数%d  中奖次数%d  未中次数%d\n", sum, success, lose);
    }
    else
    {
        ++success;
        ++sum;
        printf("有效次数%d  中奖次数%d  未中次数%d\n", sum, success, lose);
    }
}


int main()

{
    srand((unsigned int)time(NULL)); //记住这种形式!!

    int times = 0, i = 0;
    printf("Choose times\n");
    scanf("%d", &times);

    while (i < times)
    {
        printf("总第%d次 \n", i + 1);
        statistic();
        ++i;
    }

    return 0;
}

 运行结果(10000次)

总第9998次
有效次数9998  中奖次数6711  未中次数3287
总第9999次
有效次数9999  中奖次数6711  未中次数3288
总第10000次
有效次数10000  中奖次数6712  未中次数3288

可以看出换门赢的概率确实是2/3。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值