【三门问题】自写过程中遇到的种种记录,求个大大解释下期中问题的原理哇,拜谢

来源:互联网 发布:数据库脚本怎么写 编辑:程序博客网 时间:2024/06/06 09:33
今天上线意外发现自己某群里在讨论三门问题,大致是说微软出的一道面试题是这个,然后对2号门的概率是1/2还是2/3争论不休,于是我决定写个程序来试试,下面是他们说的原题:
 假设有三道门,只有一道门后有奖励,其他两道后面都是煤团,只有主人知道哪道门后有奖励。你选择1号门。在打开门前,主人打开了3号门,发现后面是煤团。现在你有两个选择:一是继续坚持你选中的1号门,二是换为打开2号门,你会怎么选择?
换门。当你选择1号门时,有66%的机会奖品不在门后面。当主人打开门后,你所选的门后依然有66%的几率没有奖品。因此,你应换2号门,这样中奖的几率会翻一倍。这道题的关键是主人知道哪道门后有奖。
为了让朋友能看懂特意用拼音写值的名称什么的了,
#include<iostream>#include<ctime>using namespace std;int kai(int da,int xz);int timu(int a);int main(){int zx,a=0,gaici=0,yuanci=0,tc;cout<<"输入执行次数"<<endl;cin>>zx;for (int i=0;i<zx;a=timu(a)){if (a==1)gaici++;elseyuanci++;i++;}cout<<"改选为正确的次数"<<gaici<<"改选为正确的几率"<<gaici/zx<<endl<<"原选为正确的次数"<<yuanci<<"几率为"<<yuanci/zx<<endl;cout<<"输入任意值退出";cin>>tc;return 0;}int timu(int a){int daan,xuanze,gaixuan,o;srand((unsigned)time(NULL));daan=rand()%3+1;xuanze=rand()%3+1;if (xuanze==daan)o=2;elseo=1;{gaixuan=kai(daan,xuanze);if (gaixuan==daan)o=1;elseo=2;}return o;}int kai(int da,int xz){int k;if (da==1){if(xz==2)k=3;elsek=2;}else{if(xz==1){if(da==2)k=3;elsek=2;}elsek=1;}return k;}
这段是错的从gaixuan=kai()往后都是逻辑错误 ,改成这样
#include<iostream>#include<ctime>using namespace std;int timu(int a);int main(){int zx,a=0,gaici=0,yuanci=0,tc;cout<<"输入执行次数(不能超过2的32次方)"<<endl;//第一行显示的cin>>zx;//输入重复多少遍for (int i=0;i<zx;a=timu(a))//重复题目{if (a==1)gaici++;//改正确的次数累加elseyuanci++;//原来正确的次数累加i++;}cout<<"改选为正确的次数"<<gaici<<"改选为正确的几率"<<gaici/(double)zx<<endl<<"原选为正确的次数"<<yuanci<<"几率为"<<yuanci/(double)zx<<endl;cout<<"输入任意值退出";cin>>tc;return 0;}int timu(int a)//这往下是题目{int daan,xuanze,o;srand(time(0));daan=rand()%3+1;//随机一个正确的答案xuanze=rand()%3+1;//随机最开始选择的数if (xuanze==daan)//如果选择的答案正确o=2;//返回上面重复题目里原来正确累加那记1次elseo=1;//返回上面重复题目里改选正确累加那记1次return o;}

还是有问题,单步执行半天,最后在随机数那出问题了,单独拿出来测试这个随机数发现,问题出在srand()这句重置随机数的问题上,测试的时候每秒输入的值都是一样的,就输出好N多个1然后N个0然后N个2什么的,原因就在时间重置随机数这个问题上,删除就可以完全执行了。
本来想int的范围是2的23次方自觉写个范围很好,结果是惨烈的,3 000 000 000的执行结果都是程序不见了,应该是崩溃了,单步执行出来几率那显示是负数就不截图,但是求来个大大解释下谢谢,已经心力交瘁不想动了,刚自学C++没多久,这问题弄了我一下午了。
0 0
原创粉丝点击