开门问题(如果你有一个机会在三个门前选择,三个门后只有一个是奖品,你选择了第一扇门,但是风把第二扇门吹开了,后面没有奖品,这时让你去更换选择,换还是不换)
求概率的问题,我用随机函数的,但是不太会用因为电脑生成的是假随机数,主要就是问两个问题一个是这个概率的编程,一个就是如何生成真随机数(如根据电脑当前时间?或者鼠标点击间隔时间)
根据电脑当前时间生成真随机数代码如下
#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))把当前时间的毫秒值作为随机数种子,就可以让程序每次运行产生不同的随机数序列。
#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);
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!