QuizWit

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ QuizWit ] in KIDS
글 쓴 이(By): dkkang (온톨러지)
날 짜 (Date): 2003년 11월 24일 월요일 오전 11시 19분 41초
제 목(Title): Re: Probability problem


84 아닙니다.

그나저나 재미삼아 시뮬레이션 코드를 만들어 봤습니다.

사용법은 

sim <생일이 겹치는 수> <사람 수> <실행 수>

처럼 하면 됩니다.

예) sim 2 22 1000000

실행은 백만번 가까이 돌리면 어느 정도 답이 나오는 거 같군요.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int simulate(int r, int N);
int main(int argc, char** argv)
{
  int r;
  int N;
  int ret;
  int run;
  int i,j;
  int same,diff;

  if (argc!=4) 
  {
    printf("sim <# of redundancy> <# of people> <# of run>\n");
    return -1;
  }
  srand(time(NULL));
  rand();
  r=atoi(argv[1]);
  printf("r=%d\n",r);
  N=atoi(argv[2]);
  printf("N=%d\n",N);
  run=atoi(argv[3]);
  printf("run=%d\n",run);
  same=diff=0;
  for (i=0;i<run;i++)
  {
    ret=simulate(r,N);
    if (ret==0)
    {
      same++;
    }
    else
    {
      diff++;
    }
  }
  printf("prob of %d has same birthday=%f\n",
    r,((double)diff)/((double)run));
  return 0;
}

// Monte Carlo
int simulate(int r, int N)
{
  int i,j;
  int day[365];

  for (i=0;i<365;i++) day[i]=0;
  for (i=0;i<N;i++)
  {
    j=1+(int) (365.0*rand()/(RAND_MAX+1.0));
    day[j]++;
  }
  for (i=0;i<365;i++)
  {
    if (day[i]>=r)
    {
      return -1; // bad
    }
  }
  return 0; // good
}

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.