1. random 함수, 로또번호 추출기

solarrrrr·2021년 4월 7일
0

Python

목록 보기
1/9
post-thumbnail

>> 4시간에 완성하는 파이썬 기초, 미운코딩새끼

파이썬 입문으로 미운코딩새끼 강의를 수강했다.
4시간이라는 아주 짧은 강의인데 아주아주 큰 틀에서
코딩이 무엇이고 파이썬이 무엇이며 주로 사용되는 문법에 대한
간략한 소개와 간략한 예제를 이용해 심플하게 진행되는 강의다.

강사의 목소리톤도 좋고 빠른 타이핑도 좋고
몇 분 단위로 짤막하게 마치 파이썬이라는 친구에 대해
소개해 주는 듯한 강의인데
아예 코딩에 C자도 모르는 사람들이 듣기에 좋은 수업 같다.

나 같은 경우 오토핫키라는 스크립트 언어를 접해 봤기에
아주아주 기초는 그래도 안다고 생각했지만 파이썬을 잘 몰랐기 때문에
유용하고 도움이 많이 되었다.

자, 그럼 강의도 들었겠다 프로그램을 한번 만들어볼까 했는데..
파이썬이 뭔지에 대해 간략히 알았을 뿐, 직접 뭔가를 만들려니
손이 가지 않았다.
뭘 해야 할지 모르겠어서..

그래서 일단 배운 왕초보 기초 문법을 이용하고 응용해서
간단한 걸 만들어보기로 했다.
바로 로또번호 생성기!

random 함수를 이용해서 간단하게 로또 번호를 추출할 수 있는데
그렇게 하면 한 줄로 띡, 끝나버리니까 좀더 업그레이드 버전을
만들어보기로 했다.

오토핫키로는 예전에 만들었던 게 있다.

대충 이렇게 생긴 것인데, 이 프로그램의 주요 동작 원리는 아래와 같다.

  1. 수동으로 6개 선택 -> 등록
  2. 1번 반복
  3. 1, 2번에 고른 번호 제외하고 등록
  4. 1, 2, 3번에 고른 번호 제외하고 등록
  5. 1번과 4번 숫자 중에서만 랜덤으로 뽑아서 등록

보통 내가 로또 수동으로 고르면 항상 꽝이라서
내가 고른 숫자들을 최대한 제외해서
확률을 높이는 방식이다.
물론 초심자의 행운이라는 것도 있기 떄문에
1, 2회차 수동으로 뽑은 건 일단 집어넣었고
그 뒤 3, 4회차 숫자는 기선택한 숫자들 모두 제외하고
랜덤으로 뽑았다.
마지막으로 5회차 숫자는 내가 맨처음 고른 6개 숫자와
마지막으로 모든 경우가 제외된
6개 숫자, 총 12개에서만 랜덤으로 뽑아내기로 진행했다.

결과는 무려 3주 연속 5등 당첨!!
이 방식은 내 손이 얼마나 똥손인가에
당첨 확률이 올라가는 로직?인지라
나에게 좋은 방법이었다.
하지만 이러나 저러나 제외된 숫자 중에
1개라도 당첨 숫자가 있으면 꽝이 되는 거라
사실 3, 4등 노리기 용도라고 봐야 할 거 같다.
대박나면 1등인 거고. ㅋㅋ

여튼 이걸 파이썬으로 구현해 보고 싶은데
아직 Gui를 배우지 않았기 때문에
파이썬 기본창으로만 진행해 보기로 했다.

>> 파이썬으로 로또번호 생성기 제작

내 첫 프로젝트! 뚜둔!
왼손코딩에서 배운 기초 문법만 가지고 만들어보기 시작.
시작에 앞서 구상하는 걸 정리해 보았다.

  1. 1부터 45까지 숫자를 리스트에 넣기.
  2. 사용자로부터 입력받은 6자리 숫자를 위 리스트에서 제외
  3. 2번 과정 한 번 더 반복
  4. 2번 과정 한 번 더 반복(총 18개의 숫자 제외)
  5. 남은 숫자 가지고 랜덤으로 로또번호 추출

오토핫키로 만든 거보다 좀더 극단적인 방식이다.
내가 고른 18개의 숫자가 모두 꽝이어야 확률이 올라간다.
물론 1등은 어렵겠지만 3등 이하 등수를 노리는 전략이다.
(대박나면 1등도 겟!)

import random # 랜덤 모듈 임포트 하기
start_num = [1, 46]

??
뭔가 이상했다.
출력해 보니 1과 46만 나옴.
구글 검색 잘 해야 좋은 개발자(라고는 안 했지만)라는 생각에

대략 검색해 보니 방법을 알았다. (배웠는데 금세 까먹..)

import random # 랜덤 모듈 불러오기
start_num = list(range(1, 46))
lotto_num = random.sample(range(start_num), 6)

??
이렇게 해 보니 range에 list를 넣는 게 안 된다는 거 같다.
오핫은 변수 그대로 넣어서 사용이 가능했는데 파이썬은 안 되나 보다.

그런데 생각해 보니 위에 나름대로 코딩 순서 정해 놨는데
까마득하게 잊고 있다는 사실을 깨달았다.
순서대로 해 보자.

import random
lotto_num = list(range(1, 46))
input_num = input("6자리를 골라보세요: ")
6자리를 골라보세요: 30 20 3 40 12 17
->>> input_num
->>> '30 20 3 40 12 17'

사용자 입력까지는 잘 받았는데 이걸 이제
lotto_num에서 제외해야 한다.

del lotto_num[input_num]

역시 이런 식으로는 안 된다. ㅜㅜ
내가 배운 지식 안에서는 사용자 입력 번호와
중복되는 숫자를 일제히 지우는 방법은 없는 거 같다.

정규식 같은 걸 이용하면 간편하겠지만
파이썬에서 정규식을 어찌 쓰는지도 모르겠고
중요한 건 배운 내용의 복습 개념이니까.

일단은 split?으로 사용자 입력 번호를 쪼개고
for문으로 하나씩 del을 이용해서 지워봐야겠다.


알아보니 del은 인덱스를 직접 지정해 지우는 방식이고
내 경우엔 지정한 값 자체로 삭제가 가능한
remove를 쓰는 게 적합해 보인다.

다만 리스트 혹은 값이 들어 있는 변수 자체를
넣어서 사용하는 방법을 모르겠다.

for i in input_num.split():
lotto_num.remove(print(i))

이런 식으로는 안 된다. ㅜㅜ


왜 그럴까 고민하다가 무릎을 탁 쳤다.
input으로 받은 인자값이 정수형이 아니라
문자열로 인식되기 때문에 안 되는 거였다.
int를 이용해 정수 형태로 변경해서 최종적으로 완성했다.

import random # 랜덤 모듈 임포트
lotto_num = list(range(1, 46)) # 로또 번호 리스트에 담고 변수 부여
for loop in range(3): # 총 3회 제외숫자 입력 받을 것
input_num = input('6개의 숫자를 골라보세요: ') # 사용자로부터 제외할 숫자 입력받기
for i in input_num.split(): # 입력받은 번호를 공백 단위로 잘라주기
i = int(i) # 바로 여기! 정수형으로 설정
lotto_num.remove(i) # 리스트에서 입력된 숫자 제외시키기
lotto = random.sample(lotto_num, 6) # 총 18개의 숫자를 제외한 후 로또 번호 랜덤 생성
lotto.sort() # 보기 좋도록 정렬
print(lotto) # 로또 번호 출력!

공부한 내용 복습 겸 첫 프로젝트(?) 완료! :)
재미있다.
또 어떤 걸 만들어볼까!

profile
몰입

0개의 댓글