m0_73079960 2023-09-23 10:12 采纳率: 75%
浏览 11

一个掷骰子相关问题C语言入门

求解答
题目是:同时抛掷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++;
     }
     //计算PAPB 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;//PAPBPAcapB放到公式函数里
     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;
}


  • 写回答

2条回答 默认 最新

  • [PE]经典八炮 2023-09-23 11:02
    关注

    你这问题太难绷了,你试用随机数求的概率,当然和理论值有误差了,难道你投100次硬币一定有50次正面?

    评论

报告相同问题?

问题事件

  • 创建了问题 9月23日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误