【黒い砂漠PS4】アクセサリー強化でクロン石を使うのはお得なのか?

最近アクセを揃え始めたので、今回はアクセサリーの強化について検証。  

今回もプログラムによる検証なので、実際とは違う場合はあると思うので参考程度に。
また、クロン石を使った場合、失敗時に下落することがありますが、そのあたりの数字は公開されていないので仮定の上で進めています。

前提条件

  • クロン石の必要数は相場によって左右されない(左右されるようなことが書いてありますが、かなり大きな価格変動が起きないと変わらない?よくわからん)
  • クロン石の必要数は下記サイトを参考にした。一応自分で確認できるものはしたけど、真4とかもってないし。確認できたものは一致してた。
  • クロン石を使用して失敗した際の下落率は強化値・アクセによって変わらない
    • そもそもクロン石を利用してアクセ叩いたことないんだが、この仮定は妥当だろうか?とはいえ、違うってなると変数が多すぎて計算できん^q^
  • 各強化の開始スタックは下記の通りとする
    • 真1:スタック20
    • 真2:スタック40
    • 真3:スタック45
    • 真4:スタック110
    • 真5:スタック200
  • 2020年11月19日の相場価格(PS4版)を参考にしている

アクセ情報


今回は基本?のAアクセのみ。他のアクセでの比較を見たい方は、計算のもととなる数値は貼っておくので、自分で計算してくださいw

この条件を元に、直叩き(クロン石を利用しない)した場合、クロン石を利用した場合(下落率30%、50%、70%の3パターン)を計算した結果、こうなる。

直叩き

※表の見方

アイテム:必要となるアクセの数
真NC:真Nへのチャレンジ回数
N助言:必要となる助言の数

費用(助言代除く)

計算式:アイテム×アクセサリー単価

クロン石使用(失敗時下落率30%)

※挑戦:挑戦した回数。よって、必要となるアクセサリーの数は挑戦+1(強化元となるアクセ)

費用(助言代除く)

 計算式(これ以降も全部同じ)

アクセ費用:(挑戦+1)*アクセサリー単価
クロン石:真1C*真1クロン石必要数+真2C*真2クロン石必要数+…+真5C*真5クロン石必要数
合計:アクセ費用+クロン石(クロン石=1Mと想定)

クロン石使用(失敗時下落率50%)

費用(助言代除く)

クロン石使用(失敗時下落率70%)

費用(助言代除く) 


結果

クロン石を使用して叩いたほうがお得になるのは真4以下の場合、オガリンのみ。それ以外は直たたきしたほうが安上がりという結果になりました。
ただ、当然ながら、助言の必要数が直たたきのほうが多くなってくるので、そこまでクロン石乙というわけでもないです。

クロン石が余っていたり、課金して手に入れている場合はクロン石使ったほうが安く上がりますが、取引所で衣装を購入して、クロン石を利用するならちょっと考えたほうが良さそうです。
NPC販売のクロン石は2Mとなるので、基本的にやらないほうが良いですね。クロン石買う費用でアクセ購入して叩く回数増やしたほうが良いです。

買うのと叩くのどっちが安いのか?

今回の費用は助言代(叩くために用意するスタック)を費用に入れていません。なので、この価格をみて叩いたほうが安い!とは即ならないので注意。だってスタック110、スタック200をシルバー換算するの無理くない?w
ただ、真3までならオガリン以外は叩いたほうが安く収まる確率は高そう。オガリンに関しては現在の相場だと助言代をゼロと考えたとしても買ったほうが安上がりになる可能性は高いです。
真4に関してはスタック110の価値をどう見るかで変わってきそうです。イベントとかでもらったスタック100があまってるとかなら、挑戦する価値はあり。特にミカリン、バジベルトは期待値的には取引所の値段の半額くらいで作れそうです。
まぁ結局は運なんだけど。

クロン石か直叩きかの境界線

計算式:クロン石数/(直叩きに必要なアクセ数 - クロン石利用で必要なアクセ数)

この価格より安くアクセサリーが手に入る場合は直叩きしたほうが安い。(あくまで確率上)
これを見ると、オガリンは境界ラインのちょい上くらいなので、もう少し安くなるなら、直叩きしたほうが安い。他は基本直叩き優位な感じです。
ミカリンの真5のクロン石の必要数が他と比べるとかなり少ないので、ミカリン真5はクロン石使ったほうがかなり安く作れるっぽいですね。まぁアクセ真5とか私には縁のない話ですが。
見直したらミカリンの真5の数字は真5のクロン石足してなかっただけだった/(^o^)\(画像は訂正済み)

まとめ

  • 取引所で衣装買って、クロン石にしてAアクセ叩くならオガリン(orライテン)。それ以外は直叩きしたほうがコスパが良い可能性が高い
  • ミカリン、バジベルトは期待値的に叩いて作るのはかなりお得。オガリンは買ったほうが安いまである
  • 結局は運
とりあえずライテンはクロン石使って真3目指してみるか…。ツン耳は…どうするか…。

ソースコード

メソッド関連
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
import copy

%matplotlib inline
%precision 3

# 叩くもの情報
# 初期確率、閾値、成功時出来るもの、失敗時できるもの
ACCESSORY = {
    "真0" : [1/4, 18, "真1", "真0"],
    "真1" : [1/10, 40, "真2", "真0"],
    "真2" : [3/40, 44, "真3", "真1"],
    "真3" : [1/40, 110, "真4", "真2"],
    "真4" : [1/200, 300, "真5", "真3"] # 閾値は適当
}

# 成功確率
def per(item, stack):
    if stack <= item[1]:
        return item[0] + (item[0] * (stack/10))
    # 閾値を超えている場合は、確率の増加が減る
    p = item[0] + (item[0] * (item[1]/10))
    p += item[0] * ((stack - item[1])/50)
    return p

# 強化
# 0~1のランダムな数が成功確率を下回っていれば成功
def challenge(item, stack):
    return per(item, stack) > np.random.rand()

# 下落したかどうか
def fall(falling):
    return falling > np.random.rand()

# 目標のアクセを完成するまで挑戦する
# クロン石を利用想定なので、スタックは増えていかないので、最大スタックを設定する意味はないんだけど、他のと合わせやすいようにそのまま
# target : string [真2・真3・真4・真5] 目標の強化値
# start : string [真1・真2・真3・真4] 最初の強化値
# strategy : dict 
# strategy = {
#     "真1" : [30, 45] # 真1を叩く最初のスタック、最大スタック
#     "真2" : [40, 60]# 真2を叩く最初のスタック、最大スタック
#     "真3" : [60, 100]# 真3を叩く最初のスタック、最大スタック
#     "真4" : [100, 300] # 真4を叩く最初のスタック、最大スタック
# }
# failling : double 失敗したときに強化値が下がる確率
def challenge_aacessory(target, start, strategy, falling):
    result = start
    stacks = copy.deepcopy(strategy)
    m = {
        "真1C" : 0,
        "真2C" : 0,
        "真3C" : 0,
        "真4C" : 0,
        "真5C" : 0,
        "挑戦" : 0,
        "失敗" : 0
    }
    for v in strategy.values() :
        m[str(v[0]) + "助言"] = 0
    # スタックを初期化
    for k in stacks :
        stacks[k][0] = -1
    
    while(target != result):
        # スタックが初期値なら助言を利用する
        if stacks[result][0] == -1 :
            m[str(strategy[result][0]) + "助言"] += 1
            stacks[result][0] = strategy[result][0]
            
        item = ACCESSORY[result]
        m[item[2] + "C"] += 1
        m["挑戦"] += 1
        if challenge(item, stacks[result][0]):
            # スタックの初期化
            stacks[result][0] = -1
            # アイテム更新
            result = item[2]
        else:
            # アイテム更新
            if fall(falling):
                result = item[3]
            m["失敗"] += 1
    
    return m 
    
 # クロン石を利用しないで強化(失敗するとアイテムは消える)
# strategy : dict 
# strategy = {
#     "真1" : [30, 45] # 真1を叩く最初のスタック、最大スタック
#     "真2" : [40, 60]# 真2を叩く最初のスタック、最大スタック
#     "真3" : [60, 100]# 真3を叩く最初のスタック、最大スタック
#     "真4" : [100, 300] # 真4を叩く最初のスタック、最大スタック
# }
def challenge_aacessory2(target, start, strategy):
    result = start
    stacks = copy.deepcopy(strategy)
    m = {
        "挑戦" : 0,
        "アイテム" : 1,
        "真1C" : 0,
        "真2C" : 0,
        "真3C" : 0,
        "真4C" : 0,
        "真5C" : 0,
        "真0X" : 0,
        "真1X" : 0,
        "真2X" : 0,
        "真3X" : 0,
        "真4X" : 0,
        "失敗" : 0
    }
    for v in strategy.values() :
        m[str(v[0]) + "助言"] = 0
    # スタックを初期化
    for k in stacks :
        stacks[k][0] = -1
    
    while(target != result):
        # スタックが初期値なら助言を利用する
        if stacks[result][0] == -1 :
            m[str(strategy[result][0]) + "助言"] += 1
            stacks[result][0] = strategy[result][0]
            
        item = ACCESSORY[result]
        m["挑戦"] += 1
        m[item[2] + "C"] += 1
        # 強化用のアクセ
        m["アイテム"] += 1
        if challenge(item, stacks[result][0]):
            # スタックの初期化
            stacks[result][0] = -1
            # アイテム更新
            result = item[2]
        else:
            # スタックの更新
            stacks[result][0] += 1
            # スタックが既定値を超えてれば仕切り直し
            if(stacks[result][0] >= stacks[result][1]):
                m[result + "X"] += 1
                m[str(strategy[result][0]) + "助言"] += 1
                stacks[result][0] = strategy[result][0]
            # アイテム更新
            result = "真0"
            m["失敗"] += 1
            # 新しいアクセを使う
            m["アイテム"] += 1
    
    return m  
出力
strategy = {
    "真0" : [20, 30],
    "真1" : [40, 45],
    "真2" : [45, 60],
    "真3" : [110, 120],
    "真4" : [200, 300]
}

count = 200000
i = 0
res = []

while(i < 5):
    target = "真" + str(i + 1)
    start = "真0"
    print(target)
    j = 0
    res2 = []
    while(j < count):
        res2.append(challenge_aacessory(target, start, strategy, 0.7))
        j += 1
        
    data = pd.DataFrame(res2)
    res.append(data.mean())
    i += 1

data = pd.DataFrame(res)
data