어제에 이어 연이어서 로또 번호 추출기 코드를 수정하여 가장 최신자 당첨 번호와 일치하는지 확인하는 코드를 짜보려고 한다.
웹 크롤링을 통해 홈페이지에서 파일을 다운받아 사용하려고 하였지만, 다운받은 엑셀파일이 하필 xls 이고, 심지어 보안 경고창도 뜨는 바람에, 다운 받은 파일을 다시 xlsx 로 저장하여 사용하였다.
사용한 라이브러리를 총 2개로 앞서 작성했던 코드와 동일하다.
먼저 xlsx로 변환한 로또 당첨 번호가 들어있는 엑셀 파일을 열어 주었다.
파일에서 확인할 수 있듯이, 가장 최근회차는 4열에 위치한다. 그래서 딱 4열의 데이터만 가져오면 된다.
pandas도 이용가능하지만, 가급적 최소한의 라이브러리를 사용하고 싶은 마음에 슬라이싱을 적극 사용하였다.
엑셀로 불러온 값들은 튜플형태이기에 리스트형태로 바꾸어 주어야 한다.
for문을 통해 4열의 값들을 하나하나 때어서 win_number라는 리스트에 저장해 주었다.
이제 슬라이싱을 통해 bonus_number 와 win_numbers에 각각 당첨번호들을 나누어 저장해주었다.
한가지 중요한 점은, bonus_number 변수를 선언할때, 가져올 값이 하나라고 슬라이싱을 [-1]로 해버리면, 가져온 값이 그냥 정수형 데이터이기 때문에 for문을 통해 반복실행 할 수 없다. 반드시 범위로 설정해서 리스트형으로 가져오던지, 아니면 [win_number[-1]] 로 가져온 값을 리스트형으로 바꾸어 주어야 한다.
반복실행에 따라 변하지 않을 값들은 while문 이전에 다 선언하여 사용하여야 한다.
while문의 시작은 lotto_number변수에 number_list로부터 6개의 값을 임의로 추출해 오는 것이다.
무작위 순서이기 때문에 sort()로 정렬해주면 나중에 엑셀 파일을 볼때 좀 더 편하다.
지난번에는 titles를 while문 안쪽으로 넣었는데, 지금 생각해보니 굳이 안쪽에 넣을 필요없이 함수가 실행될때 한번만 실행되면 된다는 사실을 알고, 밖으로 빼주었다.
while문의 경우 지난번에 썼던 코드에서 생성된 번호와 당첨번호를 맞춰주는 코드만 추가하였다.
또한 최종적으로 5개가 맞았을때 다시 한번 for문을 통해 해당 당첨번호에 보너스 번호가 있는지 확인하여 cnt_number 변수값을 2 증가 시켜주었다. 이때에는 따로 엑셀에 값을 저장할 필요가 없기 때문에 간단하게 for문을 사용하여 반복 확인해주면 된다.
한가지 중요한건 저 cnt_number 변수의 선언 위치이다. cnt_number는 당첨번호와 생성된 번호를 비교하면 맞으면 1씩 증가하는 변수이다.
예를 들어서 총 2회를 시행하는데 첫번째 실행에서 random.sample()을 통해 [4,10,15,20,26,42]의 번호 리스트를 생성했다고 가정해보자. 이중 10, 20, 42번호가 일치하여 cnt_number 가 3이 되었다.
그리고 2회 째 실행을 하게 되는데, 다시 cnt_number의 변수 선언에 따라 0으로 값이 초기화 되며, 다음 2회차에 생성된 번호를 맞춰보고 그 값을 cnt_number에 값으로 사용한다.
그런데 이걸 for 문 밖으로 빼버리면, 증가된 값이 다시 초기화되지 않고 누적되어 쌓이게 된다.
이제 프로그램을 돌려서 해당 코드가 잘 작동하는지 확인해 봐야 한다.
특히 저 2등이 잘 출력되는지 보려고 1시간째 100,000 번씩 프로그램을 실행하고 있다...
파일 여는것도 귀찮아서 터미널창에 바로 출력되도록 걸어두었는데, 글을 쓰고있는 지금 이순간에도 프로그램만 돌아가는 중이다. 역시 살면서 로또라곤 5천원 당첨되본 역사가 전부인 나에게, 이런 사이버공간에서의 희망도 없는것인가...
마지막으로 100,000번을 실행 후 당첨 금액과 로또 구매금액을 비교해 보았다.
100,000회의 로또를 구매하는데 1억이 들어간다(1회당 천원). 오기가 생겨서 글을 쓰면서 한번 더 실행해 보았다.
.
... 마지막으로 한번만 더!!!
5등이 당첨될 확률이 2%가 조금 넘는다.... 내 손이 똥손인지, 아니면 짠 코드가 엉망이라 그런지, 더이상의 이변은 없었다.
'연습 프로젝트 > python' 카테고리의 다른 글
22.11.30 로또 번호 추출기 (0) | 2022.11.30 |
---|---|
22.11.18 PO 계산기 (0) | 2022.11.18 |