源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

概率的问题:使用递归与多次试验模拟的分析

  • 时间:2021-02-15 04:44 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:概率的问题:使用递归与多次试验模拟的分析
[b]多次枚举: 实例1 [/b]口袋中有5只红球,4只白球。随机从口袋中取出3个球,取出1个红球2个白球的概率
[u]复制代码[/u] 代码如下:
<SPAN style="FONT-SIZE: 18px"> srand( (unsigned)time( NULL ) );  int n = 0;  for(int i=0; i<100000; i++)  {   char x[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};//5个红球用5个1表示 4个白球用4个2表示   int a = 0;  // 取到的红球的数目   int b = 0;  // 取到的白球的数目   for(int j=0; j<3; j++)  //取3个球进行3次循环   {    int k = rand() % (9-j);  //下标的确定  确定范围  9-j 是重点    if(x[k]==1)     a++;    else     b++;    x[k] = x[9-j-1]; //将取出数向后移动   }   if(a==1 && b==2)  n++;//取出1个红球2个白球时进行计数  }  printf("概率=%f\n", n/100000.0*100);</SPAN>
[b]实例2 [/b]
[u]复制代码[/u] 代码如下:
<SPAN style="FONT-SIZE: 18px">#define N 30 ......  int a[N];  srand( time( NULL ) );  int n = 0;  for(int k=0; k<10000; k++)  {   for(int i=0; i<N; i++)    a[i] = rand() % 365;   bool tag = false; // 假设没有相同   for(i=1; i<N; i++)   {    for(int j=0; j<i; j++)    {     if(a[i]==a[j])     {      tag = true;      break;     }    }    if(tag) break;   }   if(tag) n++;  }  printf("%f\n", 1.0 * n / 10000 * 100); </SPAN>
[b]递归: [/b]某个袋子中有红球m个,白球n个。现在要从中取出x个球。红球数目多于白球的概率 下面的代码解决了这个问题。其中的y表示红球至少出现的次数。 这与前文的问题是等价的。因为如果取30个球,要求红球数大于白球数,则等价于至少取出16个红球。
[u]复制代码[/u] 代码如下:
<SPAN style="FONT-SIZE: 18px">/*    m: 袋中红球的数目    n: 袋中白球的数目    x: 需要取出的数目    y: 红球至少出现的次数 */ double pro(int m, int n, int x, int y) {  if(y>x) return 0;  if(y==0) return 1;  //对y没有要求  if(y>m) return 0;  if(x-n>y) return 1;  //把白球全部取出,剩下就是红球 红球比至少取出还多,概率为1  double p1 = pro(m-1,n,x-1,y-1) ;   double p2 = pro(m,n-1,x-1,y);  return (double)m/(m+n) * p1 + (double)n/(m+n) * p2; }</SPAN>
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部