파이썬 로또 def - paisseon lotto def

파이썬 로또 시뮬레이션 생성기

이거는 로또 시뮬레이션으로 재미 삼아서 만들어본 건데 참고로만 아까 보시면 될 것 같아요. 로또를 해서 6개의 랜덤 당첨 번호 보너스 번호 이러한 것들을 아까 만들어 놔서 그거에 따라서 등수를 반환을 해놓고 로또 횟수에 따라서 구매에 시뮬레이션을 작동해서 돌려보는 그거예요. 로또 시뮬레이션을 한번 재미 하면서 돌려볼 수 있는 그런 코딩이라고 보시면 될 것 같습니다.

그래서 그렇게 어려운 내용이라기보다는 재미 삼아서 만들어서 할 수 있는 정도 그걸로 보시면 될 것 같고요. 제가 충격으로 먹었던 거는 이걸 돌려봤었었는데 표본이 커지면 커질수록 기대값이라는 게 정해지지 않습니까 5등 당첨될 확률 5천원 로또를 당첨될 확률이 한 2.3% 정도가 나왔습니다. 그리고 4등 5만 원이죠. 로또 4등에 당첨될 확률이 한 0.3% 정도였어요. 어마무시하게 적은 확률인 거죠. 저도 몰랐었는데 이거 로또 시뮬레이션을 이거 만들어 보면서 그때 충격을 먹었더라고요 유용하게 이거를 재미 삼아서 보셔서 하시면 될 것 같고요 크게 어려운 내용은 없고 재미 삼아서 한 번씩 해보시면 괜찮을 것 같습니다.

import numpy as np

numbers = np.random.choice(np.arange(1, 46), 7, replace = False) # 1~45 중 7개 추출

win_numbers = numbers[:-1] # 당첨 번호 6개
bonus = numbers[-1] # 보너스 번호

print(win_numbers) # [38 42 13 41 44 11]
print(bonus) # 31
def lotto(my_num, win_numbers, bonus):
    same_cnt = 0 # 일치하는 개수

    for num in win_numbers: # 각 당첨 번호 포함 여부 체크 
        if num in my_num: same_cnt += 1
    
    # 등수 반환
    if same_cnt == 6: return 1
    elif same_cnt == 5 and bonus in my_num: return 2
    elif same_cnt == 5: return 3
    elif same_cnt == 4: return 4
    elif same_cnt == 3: return 5
    else: return 6 # 꽝

# 예시 상황
my_num = [38, 35, 11, 10, 40, 42]
print(lotto(my_num, win_numbers, bonus)) # 5
lotto_cnt = 1000000 # 구매할 로또의 개수

# 당첨 번호 및 보너스 번호 추출
numbers = np.random.choice(np.arange(1, 46), 7, replace = False)
win_numbers = numbers[:-1]
bonus = numbers[-1]

history = [0] * 7 # i번 인덱스에 i등 횟수 기록(0번 인덱스는 사용 X)

# 로또 구매 시뮬레이션
for i in range(lotto_cnt):
    my_num = np.random.choice(np.arange(1, 46), 6, replace = False) # 1~45 중 6개 추출
    result = lotto(my_num, win_numbers, bonus) # 등수 반환
    history[result] += 1 # 결과 기록

# 결과 출력
for i in range(1, 6):
    print('%d등,%d'%(i, history[i]))
print('꽝 횟수, %d회'%history[-1])

파이썬 응용하기프로젝트: 로또 당첨기로또

한 파이썬 파일에서 두 개 이상의 함수를 정의할 때, 참조에 대해 궁금합니다.

donghoon kang

파이썬 로또 def - paisseon lotto def

donghoon kang

파이썬 로또 def - paisseon lotto def

질문 지켜보기를 시작하면 질문에 답변, 댓글이 달릴 때 알림을 받을 수 있어요.

2019년 2월 19일

다를 수 밖에 없어요... print(generate_numbers())를 실행하면 난수가 생기고.. print(draw_winning_numbers())에서 다시 또 generate_numbres()를 실행하니까요..

2019년 2월 20일

아, 너무 당연한 것이었네요. 음.. 근데 앞의 generate_number 함수에서 정의한 변수는 어차피 그 함수 안에서만 돌게 되는데, 다른 함수인 draw_winning_numbers 에서 generate_number 함수에서 정의한 리스트를 받아올 수 있는 방법이 있을까요??

2019년 2월 24일

draw_winning_numbers에서 generate_numbers를 호출하여 변수에 저장하면 될거에요..^^

질문 지켜보기를 시작하면 질문에 답변, 댓글이 달릴 때 알림을 받을 수 있어요.

random(난수 생성 라이브러리)

random은 난수 생성 모듈로 내장 라이브러리 중 하나이다

random의 random()은 0이상 1 미만의 수중 랜덤한 값을 return한다.

ex) random()

>>> random.random()
0.38001436104737807

0이상 1 미만이기 때문에 그 사이의 실수값이 return 되었다.

그러면 로또 번호를 얻기 위해서는 지정된 범위내에서 값을 반환하도록 사용해야 하는데

그 기능을 하는 함수는 따로있다.

ex) randrange()

>>> random.randrange(0,46)
18

randrange()는 말 그대로 ()내에 범위를 지정해준 후 그 범위내의 값을 반환한다.

range()는 범위를 설정하는 함수고 range()에 rand(난수)를 붙여 

범위지정 난수생성 함수기능을 하는 것이다.

ex) randint()

>>> random.randint(1, 46)
17

randint()는 정수형의 난수를 반환해준다 randrange()와 동일하게 범위 지정역시 가능하며

우리는 로또번호 즉 정수형 값을 받아야 하기 때문에 randint()를 사용한다

module random 사용 제작한 로또번호 생성기

import random


count = int(input("로또 번호를 몇개 생성할까요?> "))

for i in range(count):
    lotto_num = [] # 로또 번호가 담길 리스트형 변수

    for j in range(6): # 6번 반복
        rand_num = random.randint(1, 46) # 난수생성
        lotto_num.append(rand_num) # 난수를 변수에 담음

    lotto_num.sort() # 값 정렬
    print("{}. 로또번호: {}".format(i+1, lotto_num))
    
>>> 로또 번호를 몇개 생성할까요?> 4
1. 로또번호: [4, 14, 21, 28, 31, 33]
2. 로또번호: [11, 21, 35, 35, 35, 45]
3. 로또번호: [2, 6, 8, 10, 23, 40]
4. 로또번호: [12, 14, 20, 26, 30, 43]

그럼 randint()를 이용해 아주 간단한 로또 번호 생성기를 만들어봤다.

lotto_num은 난수로 생성된 로또 번호가 담길 공백 리스트로 선언되었고

rand_num은 randint()로 랜덤 생성된 로또 번호가 담길 예정이다

count는 로또 번호가 생성될 개수를 지정하는 Iterator(반복전)이다.

이렇게 로또번호를 출력하는 코드가 짜였지만 사실 이 정도의 기능은 너무 단순하고 가볍다.

로또 번호를 만드는 생성기에는 많이 모자란 듯 하다.

module numpy + 로또번호 생성기(update version)

import numpy
def make_lotto(count):
    for i in range(count):
    lotto_num = [] # 로또 번호가 담길 리스트형 변수

    for j in range(6): # 6번 반복
        lotto_num = numpy.random.choice(range(1,46),6,replace=False)
        
    lotto_num.sort() # 값 정렬
    print("{}. 로또번호: {}".format(i+1, lotto_num))


count = int(input("로또 번호를 몇개 생성할까요?> "))
make_lotto(count)


>>> 로또 번호를 몇개 생성할까요?> 5
1. 로또번호: [15 16 18 24 33 41]
2. 로또번호: [ 7 12 15 17 24 39]
3. 로또번호: [28 35 38 43 44 45]
4. 로또번호: [ 4 11 20 27 40 43]
5. 로또번호: [ 5  9 10 14 21 44]

모듈 numpy는 다차원배열을 쉽게 처리할 수 있도록 효율적인 기능을 제공하는 외부 라이브러리 패키지인데

데이터구조, 수치계산 등 여러 분야에 있어 Python에 사용되는 경우가 많다.

그리고 Numpy에는 module random과 비슷한 기능을 하는 난수 생성 기능도 존재하는데

바로 numpy의 sub package인 random()이다 

random.choice의 원형은 numpy.random.choice(array or range, size=(num), replace=T or F, p=%)

이러한데 좀 더 이해하기 쉽도록 원형에 살짝 설명을 첨가했다

먼저 첫번째 인자는 생성할 데이터인데 array형 기본으로 생성된다 ex)array([1,2,3,4,5])

size는 생성될 난수의 개수이며

replace는 True일 경우 중복선택 가능 False일 경우는 중복 선택 불가능이다

p는 배열으로 각 인자의 선택 확률을 지정해줄 수 있다.

이제 위 코드에 대해서 설명하자면 range()로 1부터 46까지의 범위를 지정해줬고

값의 중복선택은 불가능 또한 6개의 배열 인자를 갖는다.

그대로 로또 번호의 값을 담을 lotto_num에 담았고 

sort()를 통해 값을 정렬해준 후 출력했다.

그리고 이 모든 기능은 make_lotto()라는 함수를 만들어 그 함수에 삽입했다.

ex) 외부 라이브러리 설치법

pip install numpy
(pip가 작동하지 않는다면)
python -m pip install upgrade pip