りぽログ

twitterアカウント→@nakayoshi0505 とあるChemical Engineerによる徒然日記。好物はリポビタンD。たまに趣味(ゲーム・ドライブ)のことも?

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)

シミュレーション結果

ヒストグラムを作り、サンプルの分布を調べます。(横軸:武器本数、縦軸:サンプル数)f:id:cheme_nd:20190214041441p:plain:w400
青がパターン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軸ラベルの指定

書いて気づいた、これサブルーチン化した方がええやつやん...
初心者感丸出しすぎぃぃぃ!!!