본문 바로가기

독서노트

확률을 적용한 랜덤값 선택하기

rand() 함수를 사용하여 0~4 까지 랜덤값을 출력하는 코드는 아래와 같다.

  1. int myRand()
  2. {
  3. return rand()%5;

  4. }


위의 코드는 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이 선택된다.


이를 코드로 적용해 보면 아래와 같다.


  1. 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;
            }
        }
    }