확률 문제: 귀속과 여러 차례의 시험 시뮬레이션을 이용한 분석

2131 단어
여러 차례 열거: 실례 1 주머니에 붉은 공 5개, 흰 공 4개.랜덤으로 주머니에서 공 3개, 빨간 공 1개, 흰 공 2개를 꺼낼 확률
 
  
 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/100000.0*100);



인스턴스 2
 
  
#define N 30
......
 int a[N];
 srand( time( NULL ) );
 int n = 0;
 for(int k=0; k<10000; k++)
 {
  for(int i=0; i   a[i] = rand() % 365;
  bool tag = false; //
  for(i=1; i  {
   for(int j=0; j   {
    if(a[i]==a[j])
    {
     tag = true;
     break;
    }
   }
   if(tag) break;
  }
  if(tag) n++;
 }
 printf("%f
", 1.0 * n / 10000 * 100);


귀속: 어떤 자루에 붉은 공 m개, 흰 공 n개가 있다.이제 공 x개를 꺼내야 한다.적구의 수가 백구보다 많은 확률
다음 코드가 이 문제를 해결했다.그중의 y는 붉은 공이 적어도 나타난 횟수를 나타낸다.
이것은 앞의 문제와 등가이다.공을 30개 뽑으면 흰 공 수보다 빨간 공 수가 많으면 최소 16개를 뽑는 것과 같기 때문이다.
 
  
/*
   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;
}


좋은 웹페이지 즐겨찾기