IT학습/Python

[Python] 로또번호 생성기

바틀비 2024. 1. 6. 22:33

학습내용

python
for loop, while 반복문, format과 f-string, sort 메소드
numpy
random.randint(), random.choice

로또번호 생성기 조건

1. 숫자는 6개
2. 1부터 45까지
3. 순서는 오름차순
번외) 다른 블로그 글을 검색하면 파이썬 내장모듈인 random을 import하지만 여기서는 numpy만 import해서 사용했다.

방법 1

numpy의 choice를 이용해서 로또번호 생성기 만들기.

더보기
import numpy as np

lottoNum1 = np.random.choice(range(1, 46), 6, replace = False)
lottoNum1.sort()

print(lottoNum1)
print(type(lottoNum1))

#출력결과: 
# [ 7 12 15 33 38 43]
# <class 'numpy.ndarray'>

np.random.choice(range(a, b), c, replace =, p= )
a이상 b미만의 정수 모집단에서 c개를 추출
replace = True, 혹은 생략이면 복원추출. 중복을 허용한다.
replace = False면 비복원추출. 중복을 허용하지 않는다.
p = p, 혹은 생략이면 균등확률 추출
p = [0.1, 0.3, ...](합이 1인 리스트) 비균등확률 추출 -> 향후 공부 따로

lottoNum1.sort()
위에서 생성된 리스트를 정리해주는 메소드. () 생략하면 오름차순으로 정리해준다.
sort(reverse = False): 오름차순, 디폴트
sort(reverse = True): 내림차순

메모)
lottoNum1.sort()
print(lottoNum1) 가 아니라
print(lottoNum1.sort()) 하면
None이 출력된다.

numpy의 choice를 통해서 리스트를 생성하면 클래스 타입이 numpy.ndarray로 생성된다.

방법 2

for, while, randint을 이용하기

더보기
import numpy as np

lottoNum2 = [] #빈 리스트를 생성
rndNum = np.random.randint(1, 46) #랜덤으로 숫자 하나 뽑기

for i in range(6):#6번 i를 반복함
    while rndNum in lottoNum2:#rndNum이 true이면 아래의 다시 뽑기를 실행. false이면 넘어가고 append 실행
        rndNum = np.random.randint(1, 46) # 다시 뽑기
    lottoNum2.append(rndNum) #리스트의 끝 rndNum을 추가
    
lottoNum2.sort() #i를 6번 거치고 완성된 리스트를 정리해줌

print(lottoNum2)
print(type(lottoNum2))

#출력결과
# [21, 26, 32, 35, 41, 44]
# <class 'list'>

부분부분 해설은 코드의 주석을 참고.

np.random.randint(a, b, c)
a이상 b 미만의 정수 모집단에서 c개의 정수를 추출한다. 만약 c를 생략하면 1개만 추출한다.

코드가 작동되는 순서는 다음과 같다.

1. 빈 리스트 lottoNum2를 생성한다.
2. rndNum 변수에 랜덤으로 추출한 정수값 리스트 하나를 할당한다. ([21]를 할당했다고 하자.)

3 - 0. for loop을 시작한다. 지정한 횟수는 6번
3 - 1. while 조건문을 확인한다.  ( [21] = [] ) -> false
3 - 1 -1. [] 의 끝에 [21]을 붙여서 lottoNum2는 이제 [21]이 된다. (여기까지가 i = 1의 끝)
3 - 2. (i = 2 시작) while 조건문을 확인한다.  ( [21] = [21] ) -> true
3 - 2 - 1. rndNum 변수에 randint를 써서 새로운 정수값을 update 해준다. ([44]를 update함)
3 - 2 - 2. [21] 의 끝에 [44]을 붙여서 lottoNum2는 이제 [21, 44]가 된다. (여기까지가 i = 2의 끝)
(위의 과정을 i = 6 까지 반복)

4. 그렇게 생성된 lottoNum2를 오름차순으로 정리한다.
5. print 과정. 클래스는 list임

방법 2 - 응용

더보기
import numpy as np

count = int(input("로또번호를 몇개 생성할까요? ")) #count에 int값을 input함.

def makeLotto(count):
    for i in range(count): #count 만큼 lottoNum3를 생성함
        lottoNum3 = []
        
        for j in range(6):
            rndNum = np.random.randint(1, 46) #rndNum 변수에 리스트 부여
            
            while rndNum in lottoNum3:
                rndNum = np.random.randint(1, 46)
            lottoNum3.append(rndNum)
            
        lottoNum3.sort()

        print("{}. 로또번호: {}".format(i+1, lottoNum3))
        #print(f"{i+1}. 로또번호: {lottoNum3}")
 
makeLotto(count)

#출력결과:
#로또번호를 몇개 생성할까요? 4
#1. 로또번호: [2, 19, 22, 24, 28, 33]
#2. 로또번호: [8, 10, 27, 33, 35, 36]
#3. 로또번호: [23, 24, 29, 35, 41, 45]
#4. 로또번호: [7, 9, 10, 13, 19, 31]

간략 해설)

글로벌: count에 int값 update

makeLotto 함수
     for i loop
    공백 리스트를 count 만큼 생성함. 그리고 만들어진 리스트는 for j loop를 거침

           for j loop
           위의 난수 추출 리스트 만드는 과정
           리스트를 오름차순 정리하는 과정
           format 혹은 f -string을 사용하여 문장을 출력.

makeLotto 실행