CDW (Coding Discussion World)
python 기초 - 다양한 방법으로 로또 번호 생성기 만들기 본문
random 함수를 이용해서 로또 번호 만들기를 할건데 그 과정에서 여러가지 방법을 사용해보자. 그냥 생각나는 방법대로 막 만들어볼 것이다.
우선 random 함수는 아래처럼 기본적으로 0이상 1미만 사이의 난수를 생성한다.
from random import *
print(random()) # 0이상 1미만 사이의 난수 생성
print(random())
print(random())
0.8612330209423659
0.7791022028358539
0.9651835672890571
로또 번호는 1~45까지의 정수이니 어떻게 하면 될까? 방법은 여러가지가 있겠지만 우선 3가지 방법을 공유한다.
1. random 함수에 45를 곱하고 1을 더한 후 정수(int)로 변경
2. randrange를 이용해서 1~45 사이의 정수를 생성 (마지막 정수는 포함하지 않음)
3. randint를 사용해서 1~45 사이의 정수를 생성 (마지막 정수까지 포함)
from random import *
print(int(random()*45)+1) # 1~45 사이의 정수 생성
print(randrange(1, 46)) # 1~45 사이의 정수 생성
print(randint(1, 45)) # 1~45 사이의 정수 생성
이제 1~45사이의 정수를 생성하는 방법은 알았다. 다음으로 로또는 번호가 6개 생성되므로 같은 함수를 6번 수행하면 된다. (우선 중복처리는 생각하지 않겠다.)
1. 우선 순간적으로 생각난 방법은 아래처럼 for 함수를 이용하는 방법이다.
from random import *
for i in range(0,6):
print(randint(1, 45))
2. 다음으로 생각난 방법은 while을 쓰는것이다.
from random import *
i = 0
while i < 6:
print(randint(1, 45))
i += 1
3. 조금 길어지지만 함수를 만들고 함수에 가변 인자(*args)를 사용해서도 만들 수 있다.
from random import *
def ran(*args):
print(args)
ran(randint(1, 45),randint(1, 45),randint(1, 45),randint(1, 45),randint(1, 45),randint(1, 45))
(11, 7, 7, 38, 28, 24)
4. 조금 더 간단하게 한줄로 표현하고 싶다면 아래 방법도 괜찮아보인다.
from random import *
[print(randint(1, 45)) for i in range(0,6)]
6가지 로또 번호를 출력하는 여러 가지 방법을 나열해보았다. (급하게 생각한거라.. 혹시 더 좋은 방법들이 있으면 댓글 부탁드려요)
그럼 이제 중복 번호가 생기지 않게 하는 방법을 고민해보자.
우선 lotto라는 빈 list를 만든다. 그리고 랜덤 함수를 이용해서 정수를 하나 만들고 a라는 변수에 담는다. 이제 a라는 변수에 담긴 값이 lotto라는 리스트에 있으면 continue로 다시 while문으로 가고 없을 경우 해당 값을 lotto라는 리스트에 담고, 서로 다른 숫자가 6개가 나올 때까지 반복한다.
from random import *
i = 0
lotto = []
while i < 6:
a = randint(1, 45)
if a in lotto :
continue
else :
lotto.append(a)
i += 1
print(lotto)
[30, 22, 39, 14, 8, 42]
[40, 22, 35, 18, 30, 13]
진짜로 중복이 되지 않을까? 한번 셀프로 확인해보자.
print(len(set(lotto)))
set을 이용해서 중복 제거를 하고 해당 리스트의 len가 계속 6이라면 중복이 되지 않는 것이다. 이것은 또 어떻게 할까?
우선 앞에서 만든 코드를 함수로 바꾸어보자. 그리고 실행하면 로또 번호와 중복값을 제거한 리스트의 len이 나온다.
from random import *
def def_lotto():
i = 0
lotto = []
while i < 6:
a = randint(1, 45)
if a in lotto :
continue
else :
lotto.append(a)
i += 1
print(lotto)
print(len(set(lotto)))
return len(set(lotto))
def_lotto()
[32, 40, 10, 1, 16, 9]
6
이제 아래 코드를 추가해서 def_lotto 함수를 1000번 반복해보자.
j = 0
for i in range(0,1000):
if def_lotto() == 6:
j+=1
pass
else :
print("len이 5입니다. 중복이 됩니다.")
print(f"{j}번 수행할 동안 중복값이 없습니다.")
1000번 수행할 동안 중복값이 없습니다.
1000번 수행할 동안 중복값이 없는걸 보니 중복 제거가 잘 된 것 같다.
급하게 생각나는대로 만들어봤는데 다른 방법은 시간이 늦어서 다음에 추가해보겠다.
'Python > Do something' 카테고리의 다른 글
python(requests) - kakao api를 통해 data 받아와서 db에 저장하기 (2) (0) | 2023.01.08 |
---|---|
python(requests) - kakao api를 통해 data 받아와서 db에 저장하기 (1) (0) | 2023.01.08 |
python(django) - 장고로 웹페이지 만들기 (8) (0) | 2022.11.12 |
python(django) - 장고로 웹페이지 만들기, detail page (7) (1) | 2022.11.12 |
python(django) - 장고로 웹페이지 만들기, views (6) (0) | 2022.11.11 |