티스토리 뷰

수많은 사용자들은 random 모듈을 자주 사용한다.

단순하게 무작위로 난수를 생성하는 경우도 있고

특정 숫자에 가중치를 설정하여 다른 번호보다 잘 나오게 하는 경우도 있다.

가중치를 주는 경우는 주위에 자주 볼수 있는데 가장 쉬운 예를들면 모바일 게임에 캐릭터 뽑기를 들 수 있다.

기본적으로 캐릭터 등급 별로 확률이 다르고 기간한정으로 특정 캐릭터 확률 두배 이벤트 등 게임에서는 다양한 뽑기를 제공 한다.

 

이번에는 파이썬으로 가중치를 설정한 랜덤을 실습하려고 한다.

 

1.  숫자 리스트를 생성합니다

 

2. 가중치를 설정한 배열을 생성합니다.

    숫자 리스트와의 매핑은 생성된 순서대로 진행됩니다.

 

3. 난수를 생성하여 배열에 저장한다.

 

4. 난수 생성으로 나온 숫자의 갯수를 확인하여 확률을 검증합니다.

    많이 반복할수록 확률이 정확해집니다.

 

import random

# 1~10 숫자 리스트 생성
numbers = list(range(1,11))
#가중치 설정 1 : 10 , 2: 20 , 3 : 1 , 4 : 1 ................ 10 : 1
weights_list = [10] + [20]+ [1]*8
result_arr = []
percent_arr = {}
#반복 횟수
totalcount = 10000

# 반복 횟수 만큼 난수 생성 후 배열에 저장
while len(result_arr) < totalcount:
    random_num = random.choices(numbers,weights=weights_list,k=1)
    result_arr.append(random_num)


for lst in map(str,sorted(result_arr)):
    try: percent_arr[lst]+= 1
    except: percent_arr[lst]=1

#가중치 확률 검증
sum_percent = 0
for key, value in percent_arr.items():
    #숫자별로 나온 개수로 확률 출력
    print(key, round((value/totalcount)*100,2))
    #전체 확률 합계
    sum_percent += round((value/totalcount)*100,2)

print(sum_percent)

5. 결과

1번째 결과
2번째 결과
3번째 결과

가중치 계산은 10 + 20 + 1*8 = 38

비교하면 가중치 설정한 확률이 결과와 비슷하다는것을 확인할 수 있다.

 

6. 소스 분석 

a = []     : 배열 선언

b = {}     : 딕셔너리 선언

 

6-1. 난수 생성 갯수 확인 소스

for lst in map(str,sorted(result_arr)):
try: percent_arr[lst]+= 1
except: percent_arr[lst]=1

 

try : 정상일때 처리

except : 예외 발생시 처리

 

첫실행시 percent_arr[1] += 1   => 첫 반복문 실행이기에 딕셔너리에 1이라는 키가 없기에 증복합대입연산자가

                                              실행되지 않아 애러 발생 ex) null(percent_arr[1]) += 1

                                              예외 발생쪽으로 처리

 

6-2. 딕셔너리에 저장된 데이터 반복문을 이용하여 불러오기

for key, value in percent_arr.items():

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함