黒い砂漠では強化するためにスタックを貯めるのが重要になるわけですが、大半の人がレブラス+14を使ってある程度のスタックを貯めるということをしていると思います。
確率が表記されているので、到達率は簡単に計算できるのですが、目標スタックまでに消費するブラックストーンの平均値を出そうとすると、単純な計算ではできなさそうでした。すでに誰かが計算してれるかなと思って色々ググってみたんですが、なかなかそれっぽいの見つからず。
というわけで、ないなら自分でやればいいじゃないの精神で作ってみた。計算式を作ったのではなく、10万回シミュレーションを行ってその平均値などを出すという強引な方法ですが/(^o^)\
ソースコードを念の為貼っておく。もし間違いがあればツッコミが欲しい。
レブラス+14でスタックを貯めた場合のブラックストーン消費数
表の見方
確率(実測):実際に10万回シミュレーションした結果の平均到達率
確率(計算):表記される確率から計算した到達率
平均:ブラックストーンの消費数の平均値
中央値:ブラックストーンの消費数の中央値
ハマり:ブラックストーン消費数の上位1%(1000件)の平均値
失敗回数:+15レブラスになった回数の平均値
ハマり失敗:+15レブラスになった回数の上位1%(1000件)の平均値
平均費用:BS消費数平均値*(210k+6k(修理費:レブラスの値段/2))+平均失敗回数*100k(浄化代)
計算上の到達率と大きくても0.2%程度の差しかないのでほとんど収束していると見て問題ないかなと思う。
大体いろいろなところでレブラスはスタック20前後まで貯めると言われていることが多いけど、費用の概算は大体7.3M。ハマりの数値は正直あまり意味はないんですが、私はあまり運が良い方ではないので、ハマるとこのくらい消費するよっていう目安が欲しかったんじゃ。
スタック30も100個以内で出来る計算になっているので意外と狙ってもよさそうな感じではあります。
真1以降を叩いてスタックを貯める場合との比較も次回作ってみようかと思います。
ソースコード(python3)
pythonはあまり書いたことないので変なところあるかもだけど、まぁ動いてるからええやろ。
import random
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
import seaborn as sns
sns.set()
from pandas import Series, DataFrame
import statistics
%matplotlib inline
%precision 3
# 強化初期確率, 増加スタック, 出来る物
K_14 = [1/50, 1, 15]
K_15 = [2/17, 2, 16]
K_16 = [1/13, 3, 17]
K_17 = [1/16, 4, 18]
K_18 = [1/50, 5, 19]
K_19 = [3/1000, 6, 20]
# 70%を超えた計算は間違ってる
# 成功確率(武具)
def per(item, stack):
return item[0] + (item[0] * (stack/10))
# 0~1のランダムな数が成功確率を超えていれば成功
def challenge(item, stack):
return per(item, stack) > random.random()
# 目標スタックが貯まるまでレブラスを叩き続けて、BS消費数と15になった回数を返す
def challenge_stack(target):
stack = 0
total_count = 0
success_count = 0
while(target > stack):
total_count += 1
if(challenge(K_14, stack)) :
stack = 0
success_count += 1
else :
stack += 1
return total_count, success_count
stack = 1
end = 60
list = []
count = 100000
columns = ["一発成功率", "平均", "中央値", "ハマり個数", "平均失敗回数", "中央値(失敗回数)", "ハマり失敗回数"]
rows = []
while(stack <= end):
i = 0
bs_list = []
suc_list = []
while(count > i):
res = challenge_stack(stack)
bs_list.append(res[0])
suc_list.append(res[1])
i += 1
l = pd.Series(bs_list)
l2 = pd.Series(suc_list)
data = [
bs_list.count(stack)/len(bs_list) * 100,
l.mean(), l.median(), l.sort_values(ascending=False).head(int(count/100)).mean(),
l2.mean(), l2.median(), l2.sort_values(ascending=False).head(int(count/100)).mean()
]
list.append(data)
rows.append(str(stack))
stack += 1
df = pd.DataFrame(list, columns=columns, index=rows)
df