문제 출제 작업을 할 때, 데이터를 random하게 생성하는 것은 매우 중요한 일 중 하나입니다. 제가 출제한 코딩테스트 문제들은 생각보다 제약 조건이 단순하지 않아서 choices에 weights 인자를 넣어서 생성할 일은 거의 없었습니다. 그런데, 나중에 출제를 할 때 알아두면 좋을 듯 해서 정리하게 되었습니다.

 

 옛날에 문제를 출제했을 때, A, B, C 쿼리가 일정 비율로 나오게끔 generate하는 코드도 꽤 제작했던 걸 보면, 안 필요할 거 같지는 않기 때문입니다.

 


 list에 count는 리스트 내에서 value가 출현한 횟수를 세어줍니다. 예제에서는 이 함수를 많이 쓰니, 미리 언급하고 넘어가겠습니다.

 

 

 기본적으로, choices는 복원 추출을 하게 됩니다. 같은 원소를 여러 번 뽑는 것이 가능합니다. 예를 들어, 'ADD', 'DELETE'가 들어있는 상자에서 100번 복원 추출을 한다고 하겠습니다.

 

 

 그러면, 'ADD'와 'DELETE'가 2번 이상 나오게 됩니다. 이 경우는 50 : 50으로 나왔네요. 기본적으로 weights나 cum_weights에 아무런 인자도 주지 않으면 같은 확률로 'ADD', 'DELETE'를 뽑게 됩니다. 만약에 'ADD'와 'DELETE'만 있는 상황에서 비복원 추출로 100번 뽑으면 어떻게 될까요?

 

 

 이 코드는 'ADD'와 'SUM'이 있는 상자에서 100번 비복원 추출을 하는 예입니다.

 

 

 결과는 아시다시피 예외가 떨어집니다. 왜냐하면, 상자에 있는 아이템 갯수보다 많이 뽑아버렸기 때문입니다. sample과 choices의 차이는 이 글에서도 언급을 한 듯 하니 보시면 좋겠습니다.

 


 그런데, choices를 보면, weights와 cum_weights가 있음을 볼 수 있습니다. weights가 가중치이니까, 뽑을 때의 상대적인 가중치와 관련이 있어 보이는데요.

 

 

 'ADD'와 'DELETE'가 있었습니다. weights를 각각 10, 90으로 두었는데요. 이는 ADD가 뽑힐 확률이 10이라면, DELETE가 뽑힐 확률은 90이라는 의미입니다. 즉, 'ADD'와 'DELETE'가 약 10:90의 비율로 뽑힌다는 의미입니다. 쉽게 풀어 설명하면 그렇습니다. 결과를 보겠습니다.

 

 

 'ADD'는 7번, 'DELETE'는 93번 뽑혔습니다.

 


 cum_weigths는 누적 가중치를 의미합니다. [10, 100]을 넣었는데요. 'ADD'가 10번 뽑히면, 'ADD'와 'DELETE'가 100번 뽑힌다는 의미입니다. 즉, 이 말은 'DELETE'가 90번 뽑힌다는 의미와 동치임을 알 수 있습니다. 문서에서도 비슷한 설명이 있습니다. 읽어보면, cum_weigths는 누적 가중치 정도로 생각하면 좋아요.

 

 

 'ADD'가 11번 나오고 'DELETE'가 89번 나왔음을 볼 수 있습니다. 대략 10:90 정도 비율이라고 생각해도 좋겠습니다.