Pythonを用いた確率シミュレーション(キングスレイド:武器凸編)
はじめに
今回はPython(超初心者ぁぁぁwww)のお勉強として、確率シミュレーションを作ってみました。題材にしたのはスマホゲームアプリ「キングスレイド」の武器凸です。
使用環境
・MacOS Mojave バージョン 10.14.3
・anaconda3
・Python3.6
・Jupyter notebook
武器凸の仕様は以下の通り
(1)星0〜星5まである。
(2)同じ星を素材にすると100%成功。素材の星が減るごとに成功率は50%、25%、10%、1%に減少。
(3)失敗ボーナスがあり、次の成功率が、素材の星が減るごとに16%、8%、3%、0%アップ。
これについて、星0から星5にするまでに必要な武器数をシミュレーションしていきます。今回は2パターンを比較してみます。
パターン1:★3まで無凸、★4に1凸、★5に2凸をぶっこむ
パターン2:★3まで無凸、★4から★5まで1凸をぶっこむ
コードの作成
上記の設定を基に、まず星0→1のシミュレーションコードを書いてみました。サンプルを集めて分布を見るため、武器本数を配列化してます。
for i in range(0,imax): #1凸# P1=100 #基本成功率を更新 Q=0 #失敗回数をリセット while(True): x=random.randint(1,100) P2=P1+0*Q #成功確率 if x <= P2: #乱数による判定 #成功 N[i]=N[i]+1 #素材本数を更新 A[i]=A[i]+1 #凸数更新 break #次の段階へ #失敗 else: N[i]=N[i]+1 #素材本数を更新 Q=Q+1 #失敗回数を更新
あとはこれをコピペしてちょこちょこいじればいけそう。ということで完成したコードを最後に載せときます。使いたい人いたら勝手にどぞ。(誰が使うん?www)
シミュレーション結果
ヒストグラムを作り、サンプルの分布を調べます。(横軸:武器本数、縦軸:サンプル数)
青がパターン1、赤がパターン2の分布です。...見てわかるよね?赤の方が良さそうよね?
ガチ考察してもいいんだけど本筋からずれそうなので割愛(個人的にはポアソン分布/ガンマ分布に似てるのが気になるところ)
ってことでぇ、パターン2の方がパターン1より効率的!!!
おしまい
今回は武器凸シミュレーションを書かさせていただきました。まだまだ浅学なので間違い・改善点等があるかと存じます。見つけ次第、ご指摘いただければ幸いです。
また、他のパターンは?、これできない?等のリクエストも受け付けておりますので、ご気軽にお申し付けください。(初心者並感に頑張ります)
コード全文
※パターン1
%matplotlib inline import random import numpy as np import matplotlib.pyplot as plt imax=100000 A=np.zeros(imax) #武器凸数 N=np.zeros(imax) #覚醒素材の本数 x=0 #確率関数 P1=0 #基本武器凸成功率 P2=0 #失敗ボーナス付き成功率 Q=0 #武器凸失敗回数 M11=0 #5凸素材本数 P11=0 #5凸素材成功確率 Q11=0 #5凸素材失敗確率 for i in range(0,imax): #1凸# P1=100 #基本成功率を更新 Q=0 #失敗回数をリセット while(True): x=random.randint(1,100) P2=P1+0*Q #成功確率 if x <= P2: #乱数による判定 #成功 N[i]=N[i]+1 #素材本数を更新 A[i]=A[i]+1 #凸数更新 break #次の段階へ #失敗 else: N[i]=N[i]+1 #素材本数を更新 Q=Q+1 #失敗回数を更新 #2凸# P1=50 Q=0 while(True): x=random.randint(1,100) P2=P1+16*Q if x <= P2: N[i]=N[i]+1 A[i]=A[i]+1 break else: N[i]=N[i]+1 Q=Q+1 #3凸# P1=25 Q=0 while(True): x=random.randint(1,100) P2=P1+8*Q if x <= P2: N[i]=N[i]+1 A[i]=A[i]+1 break else: N[i]=N[i]+1 Q=Q+1 #4凸(覚醒素材星1)# P1=25 Q=0 while(True): x=random.randint(1,100) P2=P1+8*Q if x <= P2: N[i]=N[i]+2 A[i]=A[i]+1 break else: N[i]=N[i]+2 Q=Q+1 #5凸(覚醒素材星2)# P1=25 Q=0 while(True): #覚醒素材2凸# P11=50 Q11=0 M11=2 while(True): x=random.randint(1,100) P22=P11+16*Q11 if x <= P2: M11=M11+1 break else: M11=M11+1 Q11=Q11+1 #5凸本番# x=random.randint(1,100) P2=P1+8*Q if x <= P2: N[i]=N[i]+M11 A[i]=A[i]+1 break else: N[i]=N[i]+M11 Q=Q+1 # ヒストグラムを作成 plt.figure(figsize = (10, 10)) # 何も描画されていない新しいウィンドウを描画 plt.hist(N, bins=70, range=(0,70)) # ヒストグラムの描画 plt.xlabel('weapon-number') # x軸ラベルの指定 plt.ylabel('event') # y軸ラベルの指定
書いて気づいた、これサブルーチン化した方がええやつやん...
初心者感丸出しすぎぃぃぃ!!!