rand() 함수를 사용하여 0~4 까지 랜덤값을 출력하는 코드는 아래와 같다.
- int myRand()
- {
return rand()%5;
- }
위의 코드는 0~4 의 숫자를 모두 20%의 동일한 확률로 선택한다.
하지만 0, 1 을 다른 확률로 더 많이 선택하고 싶거나 4를 아주 작은 확률로 선택하려면 어떻게 해야 할까?
값 | 확률 |
0 | 35% |
1 | 30% |
2 | 15% |
3 | 15% |
4 | 5% |
위의 확률을 가지고 선택하고 싶다면 코드를 어떻게 작성해야할까?
누적확률값을 사용하면 쉽게 구현할 수 있다.
값 |
확률 | 누적확률값 |
0 | 35% |
30% |
1 | 30% |
65% |
2 | 15% | 80% |
3 | 15% | 95% |
4 |
5% |
5% |
우리가 구현할 알고리즘은 rand() 함수를 통해 바로 랜덤수를 선택하는 것이 아닌 rand()함수를 통해 누적확률값을 랜덤으로 선택하는 것이다.
예를 들어 랜덤으로 선택한 값이 72%라고 생각해 보자. 예를 설명하기 전에 주의할 점은누적확률값을 사용하기 위해서는 확률이 작은 것부터 정렬해야 한다.
값 |
확률 |
누적확률값 |
4 |
5% |
5% |
3 |
15% |
20% |
2 |
15% |
35% |
1 |
30% |
65% |
0 |
35% |
100% |
72%가 선택되었으므로 5%인 4는 제외, 20%내에 있는 3도 제외 35%내에 있는 2도 제외, 65%내에 있는 1도 제외, 100%안에 있는 0이 선택된다.
이를 코드로 적용해 보면 아래와 같다.
- static inline int P_WORDLENGTH_RAND()
{
double r = rand() / (double)RAND_MAX; //{0.0 - 1.0}
double dr = r * 100.0f; // {0.0 - 100.0}
double p[] = { 5.0f, 15.0f, 15.0f, 30.0f, 35.0f }; //4, 3, 2, 1, 0
double cumulative = 0.0f;
for(int i=0; i<5; i++)
{
cumulative += p[i];
if(dr <= cumulative)
{
return 4-i;
}
}
}
'독서노트' 카테고리의 다른 글
Chapter 1,2. 모델-뷰-컨트롤러 (0) | 2011.02.26 |
---|---|
Chapter 7. 익명 타입과 혼성 컨테이너 (0) | 2011.02.25 |
Cocoa Design Pattern (2) | 2011.02.25 |
컴퓨터와 구식 계산기의 차이 (0) | 2011.02.20 |
펫졸드 아저씨의 Programming Windows Phone 7 (0) | 2010.10.12 |