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()

스토리를 함께 해 온 포켓몬들도 소중하지만, 빛부가 없는 상태에서 만난 이로치는 더 소중합니다 여러분.
'Coding > Python' 카테고리의 다른 글
| 식물 데이터도 분석이 되나요? (0) | 2026.01.27 |
|---|---|
| 매우 주관적인 씨본 컬러맵 고르는 방법 (0) | 2026.01.26 |
| 데이터프레임의 정보를 확인하는 몇 가지 방법 (0) | 2026.01.08 |
| 폐암 데이터를 분석해서 생존률을 비교해보자 (0) | 2026.01.07 |
| 베이즈 정리 (0) | 2026.01.06 |