python에는 random이 있습니다. 여기에 있는 메서드 중에서 sample과 choices의 차이를 알아봅시다.

 


 먼저 예제 1번을 보겠습니다. 왠 리스트가 있는데요.

 

 

 li는 [1, 2, 3, 4, 5]입니다. 4번째 줄에서 rd.choices와 rd.sample을 호출하는데요. 결과만 보겠습니다.

 

 

 전자는 [1, 1]이 나왔습니다. 그런데, 후자는 그렇지 않았네요. [1, 1]이 나온 경우도 있었습니다. 쉽게 말해서, choices는 공 n개가 있습니다. 먼저 n개 중에 하나를 뽑았습니다. 결과를 보고 다시 넣습니다. 그러면 공 n개가 들어 있을 겁니다. n개 중에 하나를 또 뽑습니다. 즉, 표본 크기가 n이라면, 그 중 하나를 뽑고, 다시 넣는 작업을 반복합니다.

 

 sample은 그렇지 않습니다. n개 중에 하나를 뽑습니다. 결과를 보고 다시 넣지 않아요. 그러면 남은 공이 n-1개일 겁니다. 또 뽑아야 한다면, n-1개 중에 하나를 뽑습니다. 비복원 추출이라고 생각하시면 편합니다.

 

 

 그러면, 이 프로그램의 실행 결과는 어떻게 나올까요?

 

 

 전자나 후자나 [1, 1]이 나왔습니다. 어? 차이가 없는 게 아닌가? 라고 생각하실 수도 있습니다만, 중요한 것은 1이 써져 있는 공이 5개 있었다는 점입니다. 단지 공에는 1이라는 같은 수가 써져 있을 뿐이지, 같은 공은 아니라는 겁니다.

 

 


 이제 sample 함수에 대해서 문서에 나온 내용들을 조금 더 보도록 하겠습니다. 미래에는, population이 sequence가 되어야 한다고 하는데요. list나 tuple 같은 것이 되어야 한다고 생각하시면 편할 지도 모르겠어요.

 

 

 위 프로그램을 보겠습니다. 보면, list 대신에 set, dict 등을 넘기는데요.

 

 

 이것은 추후에 지원되지 않을 기능이라고 warning이 나와 있습니다. 그러면, set으로 들어왔을 때 어떻게 떨어트릴까요?

 

 

 431번째 줄을 보면, poplutaion이 set일 때, tuple로 변환한다는 것을 알 수 있습니다.

 

 

 이는 population에서의 랜덤 엑세스 연산을 하는 부분이 있기 때문입니다. 이 부분은 itertools의 accumulate 메서드와 이진 탐색을 아신다면, 어떤 역할을 하는 코드인지 파악을 하실 수 있습니다. 즉, list나 tuple, range를 sample, choices의 population 매개 변수로 넘기는 게 속 편하다. 정도만 짚고 넘어가시면 됩니다.

 

 


 이 글에서, 로또 번호를 어떻게 뽑을까에 대한 이야기를 했었는데요. 1부터 45까지의 수 중에서 서로 다른 수 6개를 뽑는 것입니다. 예를 들어서, 2, 3, 1, 7, 6, 15 이렇게요. 그럴려면 어떤 메서드를 이용해야 할까요? sample입니다. 만약에 choices를 쓰면 어떻게 될까요?

 

 

 중복을 쉽게 확인하기 위해서, 결과값을 sorted의 인자로 넘겨 보겠습니다. 그 전에, range가 있는데요. 이걸 넘겨도 되나요? 공식 문서에 잘 나와 있으니 참고하시면 됩니다. 3개밖에 없으니 어렵지 않게 외울 수 있어요. 리스트, 튜플, 레인지. 즉, range도 순서 타입인 셈입니다.

 

 아무튼, 이 프로그램을 돌려봅시다.

 

 

 그랬더니, 중간 중간 중복된 것이 보입니다. 44가 중복된 경우도 있고, 41이 중복된 경우도 있었습니다.

 

 

 sample을 쓰면 어떨까요?

 

 

 아까와는 다르게, 중복이 보이지 않음을 알 수 있습니다.