본문 바로가기
R

[R. 아르] 로또 확률 계산하기 for() / choose()

by LightBlogger 2016. 11. 8.

로또란 기본적으로 45개 중에 하나를 뽑고, 남은 44개 중에 하나를 뽑고... 의 과정을 6번 반복하는 것이다.


R은 사실 반복문을 썩 좋아하지 않는다. 반복문을 쓸 바에는 벡터로 만드는 게 낫다는 철학.


예를 들어 다음과 같이 for()를 사용하면 반복문을 만들 수 있다.



i 가 45에서 시작하여 40이 될 때까지 괄호{ } 안의 내용이 반복된다.


하지만 R은 이렇게 하느니, 45부터 40까지 벡터를 만들어서 다음과 같이 처리하는 쪽을 권장한다.



prod() 는 product 의 약자로, 벡터의 모든 요소를 곱해 주는 함수다.



어쨌든 45개 중 1개, 44개 중 1개... 를 6번 실행할 때 가능한 모든 경우의 수는 5864443200 이라는 것을 알았다.


큰 숫자이므로 콤마(,)를 찍어 보자. format() 함수의 [big.mark=] 옵션을 이용한다.



대략 58억 정도 되는가 보다.


그런데 숫자를 1, 2, 3, 4, 5, 6 을 뽑든 6, 5, 4, 3, 2, 1 을 뽑든 당첨은 마찬가지가 아닌가?


순서에 상관없다는 이야기다.


순서에 상관 없으니 6가지 숫자를 이렇게 저렇게 배열할 수 있는 총 경우의 수를 알아야 할 것이다.


그것은 6개 중 1개를 뽑고, 남은 5개 중 1개를 뽑고... 의 과정을 6번 실행하는 것과 동일하다.



720가지 경우가 있다고 한다.


그러므로 위의 5864443200 에서 중복인 720 을 제하면



대략 814만 분의 1이 로또 확률이 되는 것이다.


알겠지만 여기까지 이야기한 '45개 중 순서에 상관 없이 6개를 뽑는' 수식은 다음과 같이 쓰고



R은 '45개 중 순서에 상관 없이 6개를 뽑는' 경우의 수를 choose()라는 함수를 통해 간단히 지원한다.



내가 뽑은 숫자가 단 하나도 맞지 않을 확률은 어떻게 될까?


45개 번호 중 당첨번호 6개를 제외한 39개 중에 6개를 뽑는 경우의 수를 따지면 되겠다.



그러므로 확률은



약 40% 정도.




혹 연금복권도 궁금한 분이 계실까 봐.


연금복권의 번호는 100,000 부터 999,999 까지 부여된다. 가능한 번호의 개수는 총 900,000개


혹은 다음과 같이 계산해도 되겠다. 


6자리 숫자이며, 첫 자리에는 0을 제외한 1부터 9까지 숫자가 할당 가능하고, 나머지 자리에는 0부터 9까지의 숫자가 가능하므로



9e+5 은 900,000을 의미하며, 이런 표기 방식을 과학적 표기법(scientific notation)이라 한다.


과학적 표기법을 사용하고 싶지 않다면 format()의 [scientific=] 옵션을 사용한다.



여하튼 가능한 번호의 개수는 90만 개이며, 거기에 1조부터 7조까지 총 7세트가 있다.


그러므로 연금복권의 총 개수는



630만 장이다.


이 중에서 1등은 2장이므로



연금복권의 1등 당첨확률은 315만 분의 1이다.

반응형

댓글