Coding/Python / 포켓몬과 이항분포.md

포켓몬과 이항분포

조회

https://koreanraichu.tistory.com/760

 

포켓몬 이로치가 나올 확률로 이항분포를 때려보자

일단 이항분포가 뭐냐… 특정 확률(p)을 가진 베르누이 시행을 n번 독립적으로 반복했을 때, 성공하는 횟수(X)에 대한 이산 확률 분포라고 한다. Pass or Fail 뭐 이런건데, 여기서 중요한 건 결과가

koreanraichu.tistory.com

이거 파이썬으로 하는거 맞음.


성비와 이항분포

포켓몬에는 성비가 존재한다. 성비가 불명(무성)이거나 한쪽으로 쏠려있는 경우도 있지만 보통은 암수가 다 있는데 비율이 다른 경우가 많다. 님들 솔직히 세꿀버리 비퀸 만들어야되는데 암컷 안떠서 피눈물 흘리신 적 있으시죠? 난 있음... 아오 포고 야도뇽이 자꾸 수컷만 나와서 대환장파티여...

 

# p(성비): 7:1(0.875:0.125) / 1:1(0.5:0.5)
# n(트라이 수) = 3000 (100박스)

n = 3000
p1 = 0.125 # 암컷
p2 = 0.5

# 성비별 난수
binom_uneven = np.random.binomial(1, p1, n) # 알은 한번에 하나 나옵니다
binom_even = np.random.binomial(1, p2, n)

# 기댓값 n * p
np_uneven = n * p1
np_even = n * p2

display(f'7:1 평균 {np.mean(binom_uneven):.4f}, 기댓값 {np_uneven}')
display(f'5:5 평균 {np.mean(binom_even):.4f}, 기댓값 {np_even}')
'7:1 평균 0.1167, 기댓값 375.0'
'5:5 평균 0.5017, 기댓값 1500.0'

그 우리가... 알이... 한번에 하나나와... 그래서 저 코드가 뭔데요? 각 성비에 따라 암컷 포켓몬을 뽑기 위해서 3000번 시물 돌린 평균과 기대값이다. 성비가 언이븐한쪽이 좀 더 낮죠? 저 언이븐한쪽이 7:1이다. 일단 둘 다 암컷을 뽑는 걸로 전제하고 돌린게 이거다.

 

# 왔구나 이항분포오오오
# 성공횟수: 0~10
# 트라이: 10
# 확률: 0.125

for k in range(11):
    p = stats.binom.pmf(k, 10, 0.125)
    print(f'10번 트라이해서 {k}마리의 암컷 포켓몬을 얻을 확률: {p:.5f}')
10번 트라이해서 0마리의 암컷 포켓몬을 얻을 확률: 0.26308
10번 트라이해서 1마리의 암컷 포켓몬을 얻을 확률: 0.37582
10번 트라이해서 2마리의 암컷 포켓몬을 얻을 확률: 0.24160
10번 트라이해서 3마리의 암컷 포켓몬을 얻을 확률: 0.09204
10번 트라이해서 4마리의 암컷 포켓몬을 얻을 확률: 0.02301
10번 트라이해서 5마리의 암컷 포켓몬을 얻을 확률: 0.00394
10번 트라이해서 6마리의 암컷 포켓몬을 얻을 확률: 0.00047
10번 트라이해서 7마리의 암컷 포켓몬을 얻을 확률: 0.00004
10번 트라이해서 8마리의 암컷 포켓몬을 얻을 확률: 0.00000
10번 트라이해서 9마리의 암컷 포켓몬을 얻을 확률: 0.00000
10번 트라이해서 10마리의 암컷 포켓몬을 얻을 확률: 0.00000

10번 해서 이브이 암컷 한마리 뽑을 확률이 0.37...이니까 30%라는 얘기다. 힘내십셔.

 

# 왔구나 이항분포오오오
# 성공횟수: 0~10
# 트라이: 10
# 확률: 0.5

for k in range(11):
    p = stats.binom.pmf(k, 10, 0.5)
    print(f'10번 트라이해서 {k}마리의 암컷 포켓몬을 얻을 확률: {p:.5f}')
10번 트라이해서 0마리의 암컷 포켓몬을 얻을 확률: 0.00098
10번 트라이해서 1마리의 암컷 포켓몬을 얻을 확률: 0.00977
10번 트라이해서 2마리의 암컷 포켓몬을 얻을 확률: 0.04395
10번 트라이해서 3마리의 암컷 포켓몬을 얻을 확률: 0.11719
10번 트라이해서 4마리의 암컷 포켓몬을 얻을 확률: 0.20508
10번 트라이해서 5마리의 암컷 포켓몬을 얻을 확률: 0.24609
10번 트라이해서 6마리의 암컷 포켓몬을 얻을 확률: 0.20508
10번 트라이해서 7마리의 암컷 포켓몬을 얻을 확률: 0.11719
10번 트라이해서 8마리의 암컷 포켓몬을 얻을 확률: 0.04395
10번 트라이해서 9마리의 암컷 포켓몬을 얻을 확률: 0.00977
10번 트라이해서 10마리의 암컷 포켓몬을 얻을 확률: 0.00098

저거 시각화해보니까 약간 정규분포같이 생겼던데? 아무튼 1:1일때는 반반 확률이 제일 높다.

 

이로치와 이항분포

그 위에 게시글에서 1/4096, 1/1365, 1/512로 했었죠? 그거 할 거다.

 

1/4096

# 확률: 1/4096
# 트라이: 3000
p = 1 / 4096

for k in range(11):
    shiny = stats.binom.pmf(k, 3000, p)
    print(f'3000번 트라이해서 {k}마리의 이로치를 만날 확률: {shiny:.5f}')
3000번 트라이해서 0마리의 이로치를 만날 확률: 0.48070
3000번 트라이해서 1마리의 이로치를 만날 확률: 0.35216
3000번 트라이해서 2마리의 이로치를 만날 확률: 0.12895
3000번 트라이해서 3마리의 이로치를 만날 확률: 0.03147
3000번 트라이해서 4마리의 이로치를 만날 확률: 0.00576
3000번 트라이해서 5마리의 이로치를 만날 확률: 0.00084
3000번 트라이해서 6마리의 이로치를 만날 확률: 0.00010
3000번 트라이해서 7마리의 이로치를 만날 확률: 0.00001
3000번 트라이해서 8마리의 이로치를 만날 확률: 0.00000
3000번 트라이해서 9마리의 이로치를 만날 확률: 0.00000
3000번 트라이해서 10마리의 이로치를 만날 확률: 0.00000

그 된장맛 식스테일은 대체 어떻게 뜬 거지? 아니 예전에 소드실드 도감작하다가 식스테일 이로치 하나 잡았거든요.

 

1/1365

# 확률: 1/1365 (빛부)
# 트라이: 3000
p = 1 / 1365

for k in range(11):
    shiny = stats.binom.pmf(k, 3000, p)
    print(f'3000번 트라이해서 {k}마리의 이로치를 만날 확률: {shiny:.5f}')
3000번 트라이해서 0마리의 이로치를 만날 확률: 0.11096
3000번 트라이해서 1마리의 이로치를 만날 확률: 0.24404
3000번 트라이해서 2마리의 이로치를 만날 확률: 0.26828
3000번 트라이해서 3마리의 이로치를 만날 확률: 0.19656
3000번 트라이해서 4마리의 이로치를 만날 확률: 0.10797
3000번 트라이해서 5마리의 이로치를 만날 확률: 0.04743
3000번 트라이해서 6마리의 이로치를 만날 확률: 0.01736
3000번 트라이해서 7마리의 이로치를 만날 확률: 0.00544
3000번 트라이해서 8마리의 이로치를 만날 확률: 0.00149
3000번 트라이해서 9마리의 이로치를 만날 확률: 0.00036
3000번 트라이해서 10마리의 이로치를 만날 확률: 0.00008

이건 빛나는부적+야생이라고 보시면 된다.

 

1/512

# 확률: 1/512 (빛부+국제교배)
# 트라이: 3000
p = 1 / 512

for k in range(11):
    shiny = stats.binom.pmf(k, 3000, p)
    print(f'3000번 트라이해서 {k}마리의 이로치를 만날 확률: {shiny:.5f}')
3000번 트라이해서 0마리의 이로치를 만날 확률: 0.00284
3000번 트라이해서 1마리의 이로치를 만날 확률: 0.01665
3000번 트라이해서 2마리의 이로치를 만날 확률: 0.04887
3000번 트라이해서 3마리의 이로치를 만날 확률: 0.09557
3000번 트라이해서 4마리의 이로치를 만날 확률: 0.14013
3000번 트라이해서 5마리의 이로치를 만날 확률: 0.16432
3000번 트라이해서 6마리의 이로치를 만날 확률: 0.16051
3000번 트라이해서 7마리의 이로치를 만날 확률: 0.13435
3000번 트라이해서 8마리의 이로치를 만날 확률: 0.09837
3000번 트라이해서 9마리의 이로치를 만날 확률: 0.06399
3000번 트라이해서 10마리의 이로치를 만날 확률: 0.03746

혹시 이거 보면서 왜 하필 3000트일지 궁금하지 않았습니까? 포켓몬 인게임 내에는 박스가 있는데… 박스 하나에 포켓몬이 30마리 들어갑니다. 포켓몬 홈이 6000마리까지 되잖아요? 박스가 200개 있습니다. 그래서 박스 단위 끊는다고 3000트가 된 거다. 3000마리면 100박스임.

 

그리고 한가지 더 알아두셔야 하는 게 있는데, 1/4096이나 1/1365와 달리 1/512는 알까기 트라이 수이다. 전제에 국제교배가 붙어있는데 그게 '어버이 국적이 다른 두 포켓몬'을 교배시켜서 얻는거라 가끔 외국 유저랑 6V 메타몽을 바꾸기도 한다. 나는 한국어니까 한국어가 아닌 메타몽(혹은 한국어가 아닌 포켓몬)과 교배를 해야 저 방법이 성립하거든.

 

# 데이터프레임이 요기잉눼?
p_s1 = 1/4096
p_s2 = 1/1365
p_s3 = 1/512

k = list(range(11))

shiny1 = stats.binom.pmf(k, 3000, p_s1)
shiny2 = stats.binom.pmf(k, 3000, p_s2)
shiny3 = stats.binom.pmf(k, 3000, p_s3)

shiny_d = {
    'shiny_encounter': k,
    "1/4096": shiny1,
    "1/1365": shiny2,
    "1/512": shiny3
}

shiny_df = pd.DataFrame(shiny_d)
shiny_df
shiny_df.plot(x='shiny_encounter', style=['-', '--', ':'])
plt.title('Shiny pokemon encounter', fontsize = 16)
plt.xlabel('Shiny encounter')
plt.ylabel('Binom')
plt.show()

스토리를 함께 해 온 포켓몬들도 소중하지만, 빛부가 없는 상태에서 만난 이로치는 더 소중합니다 여러분.

댓글

홈으로 돌아가기

검색 결과

"search" 검색 결과입니다.