关于一个开门问题c语言程序的编译

开门问题(如果你有一个机会在三个门前选择,三个门后只有一个是奖品,你选择了第一扇门,但是风把第二扇门吹开了,后面没有奖品,这时让你去更换选择,换还是不换)
求概率的问题,我用随机函数的,但是不太会用因为电脑生成的是假随机数,主要就是问两个问题一个是这个概率的编程,一个就是如何生成真随机数(如根据电脑当前时间?或者鼠标点击间隔时间)

根据电脑当前时间生成真随机数代码如下

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int i,a;
    srand((unsigned)time(NULL));
    for(i=0;i<10;i++)
    {
        a = rand() % 100 + 1;
        printf("%d ",a);
    }
    return 0;
}

主要是先调用srand((unsigned)time(NULL))把当前时间的毫秒值作为随机数种子,就可以让程序每次运行产生不同的随机数序列。


开门问题c语言代码参考

思考:有三扇门,其中一扇门里有奖品,三选一,你选择其中一扇门之后,主持人先不揭晓答案,而是从另外两扇门中排除掉一个没有奖品的门,现在主持人问你,要不要换个门,请问你换还是不换?..._weixin_30564901的博客-CSDN博客 题目是这样的:有三扇门,其中一扇门里有奖品,三选一,你选择其中一扇门之后,主持人先不揭晓答案,而是从另外两扇门中排除掉一个没有奖品的门,现在主持人问你,要不要换个门,请问你换还是不换?起初我以为换与不换都是二分之一的机率,后来,我写了一个程序来证实,发现还是要换的,换是三分之二的中奖机率,不换是三分之一的中奖机率,差很多。直接看我的测试结果吧:这是C语言编写的程序... https://blog.csdn.net/weixin_30564901/article/details/96449498

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

//有三扇门,其中一扇门里有奖品,三选一,你选择其中一扇门之后
//主持人先不揭晓答案,而是从另外两扇门中排除掉一个没有奖品的门
//现在主持人问你,要不要换个门,请问你换还是不换?
//测试(总次数, 换门)
void test(int max, int change);

//入口函数
void main()
{
    //各自测试的次数
    int count = 20;

    //初始化随机种子
    srand((unsigned)time(NULL));

    //不换门测试
    printf("不换门测试:\n");
    test(count, 0);

    //换门测试
    printf("换门测试:\n");
    test(count, 1);
}

//测试(总次数, 换门)
void test(int max, int change)
{

    //max    次数:测试的总次数
    //change 换门: 0不换  1换门

    int i;     //循环因子
    int m;     //目标:本次中奖的目标数字
    int c;     //初选:本次选手初次选择的数字
    int x;     //选择:本次选手最终选择的数字
    int p;     //排除:主持人排除掉没奖的数字
    int z = 0; //中奖:中奖的总次数

    //循环多次模拟换门测试
    for (i = 0; i < max; i++)
    {
        m = rand() % 3; //目标:本次中奖的目标数字
        c = rand() % 3; //初选:本次选手初次选择的数字

        //求出主持人要排除的数字
        if (m == c)
        {
            //选手选择了一个有奖品的,主持人从另外两个没奖品当中随机排除掉一下
            p = rand() % 2; //产生  false or true
            switch (c)
            {
            case 0: //要排除的是:2 or 1
                p = p ? 2 : 1;
                break;
            case 1: //要排除的是:2 or 0
                p = p ? 2 : 0;
                break;
            case 2: //要排除的是:1 or 0
                p = p ? 1 : 0;
                break;
                ;
            }
        }
        else
        {
            //选手选择了一个没奖品的,主持人排除另一个没奖品的
            //3-(m+c) = p
            //3-(0+1) = 2
            //3-(0+2) = 1
            //3-(1+2) = 0
            p = 3 - (m + c);
        }

        //决定终选
        if (change)
        { //换门
            //x=3-(p+c)
            //x=3-(0+1) = 2
            //x=3-(0+2) = 1
            //x=3-(1+2) = 0
            x = 3 - (p + c); //换个门
        }
        else
        {          //不换门
            x = c; //最终选择和初次选择一样
        }

        //结果
        printf("第%02d次  初选的是:%d, 目标是:%d, 排除的是:%d, 终选的是:%d", i + 1, c, m, p, x);
        if (m == x)
        {
            //中奖了
            z++;
            printf("  (中奖了)\n");
        }
        else
        {
            //没中奖
            printf("\n");
        }
    }
    //输出结果
    printf("进行%d次测试,中奖%d次。\n\n", max, z);
}

逻辑参考

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img