メンタルに4人以上現れる確率は?100万回シミュレーションした結果!?[パワプロアプリ]

f:id:arimurasaji:20210131133216j:plain

こんばんは、無課金パワプラーありさじ(@ArimuraSaji)です。

今回はメンタル練習に4人以上現れる確率をシミュレーションにより出したのでご報告いたします。

 

 

結論

・メンタル練習に4人現れる確率 : 21.97%

・メンタル練習に5人現れる確率 : 49.22%

・メンタル練習に4人以上現れる確率 : 71.19%

 

 

シミュレーションの条件

・チームメイトは27人、戦国高校野手を想定しています。

・全キャラ得意練習率アップなしを想定しています。

・適材適所の書は持ってないものと想定しています。

・練習出現率はこちらを参考にしています。

イベキャラ、モブ、武将大名の練習出現率について調査した結果!?[パワプロアプリ] - 気になる(仮)

・シミュレーションにはpython3を使用しています。

 

 

シミュレーションの方法

シミュレーションは以下のコードを用いて行いました。

 

import random

def test3():
# 各練習場所を模擬
P1 = [] # 打撃
P2 = [] # 筋力
P3 = [] # 走塁
P4 = [] #
P5 = [] # 守備
P6 = [] # メンタル
P_remove = [] # 練習場所に現れなかった人を格納
P_list = [P1, P2, P3, P4, P5, P6]

# チームメイト27人を模擬
Teammate_list = ["T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9", "T10", "T11", "T12", "T13", "T14", "T15", "T16", "T17", "T18", "T19", "T20", "T21", "T22", "T23", "T24", "T25", "T26", "T27"]

def test2():
for i in range(5):
if Teammate_list == []: # Teammate_listが空のとき終了
return
test()

def test():
appear_rate0 = 0.9 # 練習出現率 https://www.arimurasaji.xyz/entry/2021/01/23/070000
appear_rate = appear_rate0/len(P_list)
teammate_num = 0
for teammate in Teammate_list:
r = random.random()
for P_num in range(len(P_list)): # チームメイト1人をどの練習場所に割り振るか
if appear_rate*P_num < r <= appear_rate*P_num + appear_rate:
P_list[P_num].append(teammate)
if len(P_list[P_num]) == 5: # チームメイト追加で練習場所が5人になった場合
P_list.pop(P_num) # その練習場所をP_listから削除
del Teammate_list[:teammate_num + 1] # 0始まりなので+1(:0では1人も除外できない)
return
if r > appear_rate0: # どの練習場所にも割り振られなかった場合
P_remove.append(teammate)
teammate_num = teammate_num + 1
del Teammate_list[:teammate_num]

test2()
return P1, P2, P3, P4, P5, P6, P_remove

def test_main():
n = 1000000 # シュミレーション回数
P_sum = 0
P6_list = [] # メンタル練習人数を格納
for i in range(n):
print("------------------------------------------------")
P1, P2, P3, P4, P5, P6, P_remove = test3()
P_len = len(P1) + len(P2) + len(P3) + len(P4) + len(P5) + len(P6) # 全練習人数
P_sum = P_sum + P_len
P6_list.append(len(P6))
print("result: ", P1, P2, P3, P4, P5, P6)
print("P_remove: ", P_remove)
print("P_len: ", P_len)
P_ave = P_sum/n # 全練習出現人数平均値
print("----------------------------------------------------")
print("P_ave: ", P_ave)
return n, P6_list

def count(n, P6_list):
for i in range(6):
result_counts = P6_list.count(i)
result_rate = result_counts/n *100
print(i, ": ", result_counts, "counts, ", result_rate, "%")


n, P6_list = test_main()
count(n, P6_list)


 

詳しい話は省略しますが、ゲーム内で起こっていることを再現しているだけです。

毎週、各練習場所にチームメイトがランダムに配置されますよね。 

あれをこのシミュレーションで再現しています。

そしてメンタルにいるチームメイトの数を数えているだけです。 

 

 

結果

100万回シミュレーションした結果は以下の通りです。

 

----------------------------------------------------
P_ave: 24.292163
0 人: 3801 counts, 0.3801 %
1 人: 26913 counts, 2.6913 %
2 人: 87700 counts, 8.77 %
3 人: 169644 counts, 16.964399999999998 %
4 人: 219726 counts, 21.9726 %
5 人: 492216 counts, 49.221599999999995 %

Process finished with exit code 0

 

まずはシミュレーションの精度を確認しておきましょう。  

以下が1回毎のシミュレーションの結果となります。

------------------------------------------------
result: ['T1', 'T19', 'T25'] ['T14', 'T21'] ['T2', 'T3', 'T17', 'T18', 'T27'] ['T5', 'T7', 'T10', 'T26'] ['T4', 'T8', 'T9', 'T12', 'T13'] ['T6', 'T11', 'T15', 'T16', 'T20']
P_remove: ['T22', 'T23', 'T24']
P_len: 24
------------------------------------------------

全チームメイトが各練習場所にしっかりと割り振られてることがわかります。

 

また、P_ave(全練習場所の人数を平均したもの)は24.29人となりました。

P_aveの理論値は

    27 * 0.9 = 24.3 %

なので、かなり正確にシミュレーション出来てることがわかります。

100万回回したので当然と言えば当然かもしれませんが。

 

 

肝心のメンタル練習の人数ですが5人の場合が49.22%、4人の場合が21.97%となりました。

なので4人以上のチームメイトがメンタル練習に現れる確率はそれらを合計して71.19%となります。

逆に言えば約29%の確率でメンタル練習の人数が3人以下ということです。

この結果からだいたい3回に1回はメンタル練習を踏めないことがわかります。

野手育成時でもいつでもメンタル練習を踏めるとは思わずに、体力には余裕を持った方が良さそうですね。

 

 

ありさじ(@ArimuraSaji)