기본 콘텐츠로 건너뛰기

파이썬으로 로또 번호를 만들어 볼까?

파이썬으로 로또 번호를 뽑을 수 있는 방법이 여러 가지 있겠지만, 나 같은 초보자가 짤 수 있는 것은 기껏해야 두 가지 정도다.

random 라이브러리를 이용해서

1~45까지의 임의의 정수를 추출하는 randrange(1, 46), randint(1, 45)를 써서 숫자를 뽑는 방법이다.

from random import *

print(randrange(1, 46))
print(randrange(1, 46))
print(randrange(1, 46))
print(randrange(1, 46))
print(randrange(1, 46))
print(randrange(1, 46))

이런 식으로 하면 1~45 사이의 6개의 숫자를 무작위로 뽑을 수 있다. 다만 이 경우는 중복을 막을 수 없다. 그렇게 중복이 자주 일어나는 것 같지는 않지만.

역시 random 라이브러리를 이용하지만, 리스트에서 원소를 뽑는 방식을 사용하면 훨씬 그럴 듯하게 '로또 번호'를 파이썬으로 만들어 볼 수 있다.

1~n까지 숫자로 이루어진 리스트를 만드는 방법을 알고,

해당 리스트에서 중복 없이 m개의 원소를 뽑는 함수를 알면 된다.

파이썬에서 1에서 N까지의 숫자 목록

위의 글에서 1~45까지 숫자 리스트 만드는 법을 참고할 수 있었다.

함수를 정의하는 방식으로 작성되어 있다.

def createList(n):
lst = []
for i in range(n+1):
lst.append(i)
return(lst)

print(createList(10))

0~10까지의 수로 이루어진 리스트를 이렇게 정의했는데, 원하는 것은 1~45이므로

range(1, n+1)로 해주면 1~n까지의 리스트 생성 함수를 정의할 수 있다.

def createList(n):
lst = []
for i in range(1, n+1):
lst.append(i)
return(lst)

이렇게 하고 createList(45)를 해 주면 1~45의 수를 갖는 리스트가 생성된다.

리스트에서 중복없이 원소를 뽑아내는 것은 sample()을 이용하면 된다.

sample(a, b)는 a 리스트에서 b 갯수만큼 중복 없이 원소를 꺼낸다는 의미이다.

createList(45)에 lst란 변수를 할당해서, sample(lst, 6)을 하면 1~45 중에서 6개의 숫자를 중복없이 뽑아준다. 이걸 프린트 해주면 결과를 볼 수 있다. 

완성된 코드는 다음과 같다. (print를 5번 반복하지 않고 코드를 줄이는 방법이 있겠지만 아직 파악하지는 못했다)

from random import *

def createlist(n):
lst = []
for i in range(1, n+1):
lst.append(i)
return(lst)

lst = createlist(45)

print(sample(lst, 6))
print(sample(lst, 6))
print(sample(lst, 6))
print(sample(lst, 6))
print(sample(lst, 6))

구글링을 해 보니 훨씬 간단하게 짠 로또 번호 생성기들이 많이 있는 것 같다. 

━━━━━━

추가1

아래 print문 5개는 다음과 같이 줄일 수 있다. for문을 배웠지만 자유롭게 쓰지는 못하니 앞에서 적용을 못했었다. 제대로 짠 것인지는 모르지만 결과는 제대로 나오니까...

for i in range(1, 6):
print(sample(lst, 6))

이렇게 하면 print(sample(lst, 6))을 5회 반복할 수 있다. (보통 로또는 5회분을 구매하니까)

추가2

createlist()를 정의하지 않고 간단하게 [1~45] 리스트를 만드는 방법을 알았다.

range(1, 46)을 list() 함수로 처리하면 간단하게 [1, 2, ..., 45] 리스트를 만들 수 있다. 이렇게 하면 4행짜리 코드로 로또 번호를 n개 생성할 수 있다. 

정리하면 아래와 같다.

from random import *

lottonumset = list(range(1, 46))

for i in range(1, n+1):
print(sample(lottonumset, 6))

위의 코드에서 변수를 제거하면 1행을 더 줄일 수 있다.

from random import *

for i in range(1, n+1):
print(sample(list(range(1, 46)), 6))

여기에서 for문 1줄 쓰기를 하면 또 1행을 줄일 수 있다.


from random import *
[print(sample(list(range(1, 46)), 6)) for i in range(1, n+1)]

댓글

이 블로그의 인기 게시물

태백산, 산당, 서낭당 그리고 사람들┃답사 후기

[2017년 6월에 태백산 일대의 답사를 다녀와서 쓴 글입니다. 답사는 6월 3일부터 6월 4일까지. 후기 작성일 2017. 6. 7.] · · · 태백산에 다녀왔다. 천제단, https://www.khan.co.kr/local/Gangwon/article/202204281434001#c2b 난 답사를 싫어한다. 주위 사람들은 다 알고 있다. '왜 가야 하나'에 적절한 답을 가져본 적이 없다. 학부 때는 '학술'을 가장한 MT같은 것이니 어쩔 수 없다 싶었는데, 대학원에 들어와서는 그마저도 관심이 시들해졌다. '학'은 사라지고 '술'을 위해서 가는 것이라면 또 굳이 갈 이유가 있을까 싶기도 했다. (실제 답사가 다 그런 것은 아니다. 내가 답사에서 무언가 발견할 수 없었기 때문에 그렇게 느꼈던 것 같다) 그런데 박사수료 후부터 조금 달라졌다. 이제 '그곳'에 가면 이야기가 보이기 시작한다. 그것도 재미가 있다. 왜 그런가 싶었는데, 역시 수준 높은 연구자들과 함께 가서 그런 것 같다. 혼자 갔다면 도저히 그곳의 이야기, 그곳 사람들의 이야기를 듣지 못했을 터다. ('자기 문제의식'이 명료화 되었다는 점도 중요한 것 같기는 하다) '산악신앙'은 상식적으로는 '원시신앙'으로 학술적으로는 자연신앙 내지는 마을신앙과 관련된 민속신앙으로 이야기된다. 고도의 신학적 이야기, 그래서 인생의 의미를 음미하는 따위의 것이 담겨있지 않다. 그래서 상당히 빈곤하게 이해된다. 그런데 이번에 태백산 답사를 가서, 거기에 '인간'을 들여다 보는 '어떤 창'이 있다는 것을 새삼스럽게 확인하게 되었다. 산은 '신성한 곳'이다 태백산 같이 높은 산, 주변 지역의 '중심'이 되는 산은 특히 그렇다. 그런 산들은 일단 직접적으로 인간에게 '위험'하다. 맹수로부터 목숨을 위협 받을 수 있는 곳이다. 높...

오늘이 토끼 해의 시작? - 양력 1월 1일과 계묘년 (얼룩소 글)

※ 이 글은 '얼룩소'에 2023년 1월 1일에 게재했던 글입니다. ─── ∞∞∞ ─── 양력 1월 1일이 밝았네요. 종교가 없더라도 해맞이, 떡국먹기, 덕담 등을 하게 되는 날입니다. 저도 새해 첫날 일출을 보며 올해 꼭 이루고 싶은 것을 소원으로 빌 계획입니다. 그런데 언론에서 이 시기가 되면 늘 호들갑 떨며 이야기하는 것이 있습니다.  'OOO년 새해가 밝았습니다!'  언젠가부터 우리는 위화감 없이 양력 설에 'OOO년 새해'라는 이야기를 하고 있습니다. https://www.gynews.kr/news/articleView.html?idxno=21376 2022년은 임인년(壬寅年)이었고, 2023년은 계묘년(癸卯年)입니다. '검은 토끼의 해'라고들 합니다. 일단 'OOO년'은 60갑자로 만드는 거 다 아실 겁니다. 10간: 갑을병정무기경신임 계 12지: 자축인 묘 진사오미신유술해 색은 10간에 배당되어 있죠. 오방색이라 해서 청·적·황·백·흑색을 말하죠. 각각 방위가 배당되어 있어 오'방'색이라 하는 것이죠. https://blog.naver.com/patorry '임계'에 흑색이 배당되어 있어서 '검은 토끼'하는 것입니다. 그런데 육십갑자 기년법(紀年法)과 오방색이 결합된 것은 비교적 최근의 일인 것 같습니다. 관련 분야 전문가들은 한결같이 과거 기록에서는 볼 수 없었다고 말하니 말입니다( 자료 1 ).  이걸 두고 사이비 종교나 상업주의에 물든 무지성 추종이라 핏대 세워 비판하는 경우도 있습니다만, 민속(문화)은 사실 계속 변하는 것이죠. 육십갑자 기년과 오방색을 결합해 이야기하는 것은 현대 소비문화에 최적화된 민속 관념의 현주소를 보여주는 것으로 볼 수 있습니다.   사실 그보다 흥미로운 것은 양력 체계와 음력 체계가 뒤섞였다는 점이죠 뭐 새삼스러울 것은 없습니다. 우리의 조상님들은 음력만 쓰지 않고 양력도 써 왔죠. 그래서 ...

천문학적으로 의미가 없는 1월 1일은 왜 새해 첫날이 되었을까?

천문학적 관점에서 볼 때 1월 1일은 참 애매한 날입니다. 지난 번에 '크리스마스와 동지 축제'라는 시리즈 글을 다루면서 동지가 '시간의 마디'로 인식된 측면(참고: 절기, 시간의 마디와 의례 본능 )도 이야기한 바 있습니다만, 천체의 움직임(태양이나 달)과 1월 1일은 사실 연결되어 있지 않습니다. 태양 고도의 극점(solstice)이나 평분점(equinox)은 시간 사이클 상에서 변화의 기준점 역할을 하지만 달력에는 애매한 위치에 자리잡고 있습니다. 21, 22일 혹은 22, 23일입니다(2023 춘분: 3월 21, 하지: 6월 21일, 추분: 9월 23일, 동지: 12월 22일). 왜 이렇게 되었는가를 역사적 기원으로 이야기하면 율리우스력을 이야기하게 됩니다. 율리우스 카이사르가 새로운 역법을 정할 때 1년을 365.25일로 정하고(소수점 시간은 윤년으로 처리), 춘분을 3월 23일로 정했다고 합니다. 그래서 지금의 1월 1일이 신년의 첫날이 된 것이라고 합니다. 춘분을 4월 1일로 만들었다면 어땠을까요? 그럼 동지가 1월 1일이 되었을 겁니다. 왜 그런 선택을 하지 않았을지 궁금합니다. 천문학적 기준점을 왜 새해 첫날로 삼지 않았을까라는 의문은 계속 해소되지 않습니다. 고대 로마 달력 https://www.througheternity.com/en/blog/history/beware-ides-march-assassination-julius-caesar.html 율리우스력의 기원이 되는 이집트력을 생각해 봐야 하는 것인지도 모릅니다. 이집트력은 농경 생활과 천문 지식의 결합을 통해서 만들어졌다고 볼 수 있습니다. 고대 이집트 달력 https://historicaleve.com/ancient-egyptian-calendar/ 이집트인들은 나일강의 범람 주기, 천문 현상의 변화에 대한 지식을 가지고 한 달을 30일, 1년을 365일(3개 계절-범람기Akhet, 발아기Peret, 추수기Shemu)로 하는 역법...