求解答
题目是:同时抛掷4枚相同的骰子,事件A表示“各个骰子出现的点数各不相同”事件B表示“至少有一个骰子出现的点数是1”现在要求:(1)P(A|B)即在事件B发生的条件下A发生的概率,(2)P(B|A)即在事件A发生的条件下B发生的概率。答案分别是:240/671和2/3.我的程序得出的结果分别是P(B|A)=0.495902
P(A|B)=0.352427。P(A|B)是差不多的,但是P(B|A)就差了0.1左右。我的程序有什么逻辑上的错误
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int dice()
{
int value_1=0;
value_1=rand()%6+1;
return value_1;
/*int a = rand() % 51 + 13; //产生13~63的随机数
分析:取模即取余,rand()%51+13我们可以看成两部分:rand()%51是产生 0~50 的随机数,后面+13保证 a 最小只能是 13,最大就是 50+13=63*/
}
int AcapB(int total,int value_1,int value_2,int value_3,int value_4)//求A\capB
{
int boolean_AcapB=0;
if(value_1!=value_2&&value_1!=value_3&&value_1!=value_4&&value_2!=value_3&&value_2!=value_4&&value_3!=value_4)//&是交 ||是并 并字就是||构成的
{
if((value_1==1||value_2==1||value_3==1||value_4==1))
{
boolean_AcapB=1;
return boolean_AcapB;
}
}return 0;
}
int TimesOf_A(int total,int value_1,int value_2,int value_3,int value_4)
{
int boolean_A=0;
if(value_1!=value_2&&value_1!=value_3&&value_1!=value_4&&value_2!=value_3&&value_3!=value_4)
{
boolean_A=1; return boolean_A;
}return 0;
}
int TimesOf_B(int total,int value_1,int value_2,int value_3,int value_4)
{
int boolean_B=0;
if(value_1==1||value_2==1||value_3==1||value_4==1)
{
boolean_B=1;return boolean_B;
}return 0;
}
float CalOf_AcapB(float times_AcapB,float total)
{
float P_AcapB;
P_AcapB=times_AcapB/total;
return P_AcapB;
}
float CalOf_A(float times_A,float total)
{
float P_A=0;
P_A=times_A/total;
return P_A;
}
float CalOf_B(float times_B,float total)
{
float P_B=0;
P_B=times_B/total;
return P_B;
}
float P_BlA(float P_AcapB,float P_A)
{
float P_1;
P_1=P_AcapB/P_A;
return P_1;
}
float P_AlB(float P_AcapB,float P_B)
{
float P_2;
P_2=P_AcapB/P_B;
return P_2;
}
int main()
{
int i=0,j=0;
float total=10000;
int value_1,value_2,value_3,value_4;
float times_1=0,times_2=0;
float times_AcapB=0,times_B=0,times_A=0;
float P_A,P_B,P_AcapB;
srand((unsigned)time(NULL));
for(i=0;i<total;i++)//接收骰子值
{
value_1=dice();
value_2=dice();
value_3=dice();
value_4=dice();
//记录A B AcapB发生的次数
float ValueOfAcapB;float TimesOfP_A=0;float TimesOfP_B=0;float TimesOfP_AcapB=0;//接收P(A\capB A B),每次循环都要变成0;
ValueOfAcapB=AcapB(total,value_1,value_2,value_3,value_4);//接收AcapB的返回值,为布尔变量,若为1,则可加一
if(ValueOfAcapB==1)
{
times_AcapB++;
}
TimesOfP_A=TimesOf_A(total,value_1,value_2,value_3,value_4);//接收A发生次数,利用函数CalOf_A将发生次数除以总次数
if(TimesOfP_A==1)
{
times_A++;
}
TimesOfP_B=TimesOf_B(total,value_1,value_2,value_3,value_4);//接收B发生次数
if(TimesOfP_B==1)
{
times_B++;
}
//计算PA和PB PAcapB
P_A=CalOf_A(times_A,total);
P_B=CalOf_B(times_B,total);
P_AcapB=CalOf_AcapB(times_AcapB,total);
}
float P_1,P_2;//将PA和PB和PAcapB放到公式函数里
P_1=P_BlA(P_AcapB,P_A);
P_2=P_AlB(P_AcapB,P_B);
printf("P(B|A)=");
printf("%f\n",P_1);
printf("P(A|B)=");
printf("%f",P_2);
return 0;
}