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

关于一个开门问题c语言程序的编译
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- CSDN专家-天际的海浪 2022-01-13 04:09关注
根据电脑当前时间生成真随机数代码如下
#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); }
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用