どうも、TeXTeXです。
黒い砂漠ですが確率表記&新取引所が実装されたのでレブラス+15チャレンジで貯めるスタックの価格を計算してみました。
実際は計算というよりゴリ押しシミュレートなんですがね…
細けえこたぁってやつです。
ついでに前回の記事でスタック貯め成功率を計算できますのでよろしければご利用下さい。
スタックコストデータ
とにもかくにもまずは結果のデータから御覧ください。
| スタック | 価格 | 必要BS数 |
|---|---|---|
| 1 | 223,000 | 1.02 |
| 2 | 451,000 | 2.066 |
| 3 | 686,000 | 3.141 |
| 4 | 929,000 | 4.252 |
| 5 | 1,180,000 | 5.404 |
| 6 | 1,440,000 | 6.601 |
| 7 | 1,720,000 | 7.853 |
| 8 | 2,010,000 | 9.166 |
| 9 | 2,310,000 | 10.54 |
| 10 | 2,630,000 | 12 |
| 11 | 2,970,000 | 13.54 |
| 12 | 3,330,000 | 15.18 |
| 13 | 3,710,000 | 16.93 |
| 14 | 4,120,000 | 18.78 |
| 15 | 4,560,000 | 20.79 |
| 16 | 5,030,000 | 22.94 |
| 17 | 5,550,000 | 25.26 |
| 18 | 6,090,000 | 27.74 |
| 19 | 6,700,000 | 30.43 |
| 20 | 7,340,000 | 33.41 |
| 21 | 8,040,000 | 36.6 |
| 22 | 8,820,000 | 40.08 |
| 23 | 9,650,000 | 43.88 |
| 24 | 10,600,000 | 47.99 |
| 25 | 11,600,000 | 52.57 |
| 26 | 12,700,000 | 57.67 |
| 27 | 13,900,000 | 63.28 |
| 28 | 15,300,000 | 69.32 |
| 29 | 16,800,000 | 76.13 |
| 30 | 18,400,000 | 83.73 |
| 31 | 20,300,000 | 92 |
| 32 | 22,400,000 | 101.4 |
| 33 | 24,600,000 | 111.7 |
| 34 | 27,200,000 | 123.3 |
| 35 | 30,100,000 | 136.3 |
| 36 | 33,300,000 | 151 |
| 37 | 36,900,000 | 167.3 |
| 38 | 41,000,000 | 185.5 |
| 39 | 45,600,000 | 206.5 |
| 40 | 50,800,000 | 230.1 |
| 41 | 56,600,000 | 257.2 |
| 42 | 63,400,000 | 287 |
| 43 | 71,000,000 | 321 |
| 44 | 79,600,000 | 360.6 |
| 45 | 89,600,000 | 404.9 |
| 46 | 101,000,000 | 456.1 |
| 47 | 114,000,000 | 515.8 |
| 48 | 129,000,000 | 583.9 |
| 49 | 146,000,000 | 660.4 |
| 50 | 166,000,000 | 749 |
| 51 | 188,000,000 | |
| 52 | 215,000,000 | |
| 53 | 246,000,000 | |
| 54 | 281,000,000 | |
| 55 | 323,000,000 | |
| 56 | 371,000,000 | |
| 57 | 428,000,000 | |
| 58 | 495,000,000 | |
| 59 | 573,000,000 | |
| 60 | 666,000,000 | |
| 61 | 772,000,000 | |
| 62 | 902,000,000 | |
| 63 | 1,050,000,000 | |
| 64 | 1,230,000,000 | |
| 65 | 1,450,000,000 | |
| 66 | 1,700,000,000 | |
| 67 | 2,010,000,000 | |
| 68 | 2,380,000,000 | |
| 69 | 2,820,000,000 | |
| 70 | 3,340,000,000 | |
| 71 | 3,980,000,000 | |
| 72 | 4,760,000,000 | |
| 73 | 5,670,000,000 | |
| 74 | 6,820,000,000 | |
| 75 | 8,190,000,000 | |
| 76 | 9,870,000,000 | |
| 77 | 11,900,000,000 | |
| 78 | 14,400,000,000 | |
| 79 | 17,500,000,000 | |
| 80 | 21,300,000,000 |
このコストですが、おそらく50くらいまではレブラス叩きが最安となるためそこまではおおよその参考にして下さって結構です。
しかし50~60の間くらいで緑防具真Ⅳチャレンジと交差すると思われるので、50を超えたあたりからは参考にならない数値となってきます。
その辺の計算は現在やってる最中なのでそのうちブログ更新できるかなと思ってます。(と言っても取引所の黒石関連が青天井になるという噂もあるのでそれ以降になりそうですが)
さて、スタック50にかかる費用ですがおよそ166Mシルバーと計算されました。価格としてはジャスティンアーマーが買える価格なので、このあたりで+15が成功してしまうと精神的にきつそうです。さらに必要ブラックストーン数も約750個となっており1日100個集められたとしても1週間で貯めきれない数が要求されます。これだとちょっとコスト的にも物量的にも厳しいです。
そこでブラックストーン100個を目安にすると、スタック32が101.4個でコストは22.4Mシルバーと現実的な数値になってきます。これくらいなら挑戦しても良さそうですが、抽出する場合を考えると83.73個で184Mシルバーなスタック30が良いでしょうね。まあどのあたりを目標にするかはブラックストーン供給数と資産との相談となります。でもナーガ2時間(武器防具考慮せず)で貯められそうなスタック30近辺は非常に魅力的です。
しかしこれはあくまで期待値なので、試行回数が少なければハマることも上手くいくこともあります。なのでどこまで叩くかというのは流れを読む必要がありそうです。つまりどこまで参考にするかは自己責任でお願いします。
ソイソースコード
ここからはシミュレートしたソースコードを書いていきます。言語はPython 3です。
ちなみにPythonを触るのは初めてですし、プログラミングも別に得意ではないのでガバガバです。
スタックコストを求める方は半日以上かかりました。やっぱりスタック80まで計算したのが馬鹿でしたね。裏で砂漠起動してたのもアホなんですけど…
まずはコストを求める方から。
※16スレッドのCPUを想定してます。
from multiprocessing import Pool
import random
import time
import csv
BLACK_STONE_COST = 210000
DURABILITY_COST = 6450
CLEANSE_COST = 100000
PROCESSER_NUM = 12
INITIAL_COST = 0
INITIAL_STACK = 0
INITIAL_P = 0.02
STEP_P = 0.002
NUMBER_OF_RUNS = 1000000
TARGET_STACK = 80
def stack_simulate(total_cost,stack,target_stack):
while stack < target_stack:
total_cost += BLACK_STONE_COST
if random.random() < (INITIAL_P + (STEP_P * stack)):
#Enhance successful
total_cost += CLEANSE_COST
stack = 0
else:
#Enhance failed
total_cost += DURABILITY_COST
stack += 1
return total_cost
def wrap(List):
return stack_simulate(*List)
def malti_process(target_stack):
total_cost = INITIAL_COST
stack = INITIAL_STACK
List = [(total_cost,stack,target_stack) for runs in range(NUMBER_OF_RUNS)]
pool = Pool(processes=PROCESSER_NUM)
total_cost = pool.map(wrap,List)
pool.close()
return total_cost
def first(target_stack,f):
n = 0
cost = 0
total_cost = malti_process(target_stack)
for n in range(NUMBER_OF_RUNS):
cost = cost + total_cost[n]
writer = csv.writer(f)
writer.writerow([target_stack, cost/NUMBER_OF_RUNS])
if __name__ == "__main__":
start = time.time()
with open('stack_cost_(0-80).csv', 'w', newline = '') as f:
for target_stack in range(1,TARGET_STACK + 1):
first(target_stack,f)
print(target_stack,'done\n')
f.close()
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
お次はブラックストーン数の方。
from multiprocessing import Pool
import random
import time
import csv
BLACK_STONE_COST = 210000
DURABILITY_COST = 6450
CLEANSE_COST = 100000
PROCESSER_NUM = 12
INITIAL_COST = 0
INITIAL_STACK = 0
INITIAL_P = 0.02
STEP_P = 0.002
NUMBER_OF_RUNS = 1000000
TARGET_STACK = 50
def stack_simulate(total_num,stack,target_stack):
while stack < target_stack:
total_num +=1
if random.random() < (INITIAL_P + (STEP_P * stack)):
#Enhance successful
stack = 0
else:
#Enhance failed
stack += 1
return total_num
def wrap(List):
return stack_simulate(*List)
def malti_process(target_stack):
total_num = 0
stack = INITIAL_STACK
List = [(total_num,stack,target_stack) for runs in range(NUMBER_OF_RUNS)]
pool = Pool(processes=PROCESSER_NUM)
total_num = pool.map(wrap,List)
pool.close()
return total_num
def first(target_stack,f):
n = 0
num = 0
total_num = malti_process(target_stack)
for n in range(NUMBER_OF_RUNS):
num = num + total_num[n]
writer = csv.writer(f)
writer.writerow([target_stack, num/NUMBER_OF_RUNS])
if __name__ == "__main__":
start = time.time()
with open('stack_num_(0-50).csv', 'w', newline = '') as f:
for target_stack in range(1,TARGET_STACK + 1):
first(target_stack,f)
print(target_stack,'done\n')
f.close()
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
※2つに分けてるのは後からBS数を計算したためです。普通にやるなら2つ合体させちゃってOKです。
参考にしたのは某巨大掲示板の書き込み。
引用 https://mevius.5ch.net/test/read.cgi/mmo/1547208123/
シングルスレッドで劇遅い&ファイル出力がなかったためそこを含めて何点か改善しました。本当はwhile文もFor文に書き換えたほうが速いんですけど…面倒なのでやめました。
やってることは
- (メルセンヌ・ツイスタで)0~1の疑似乱数生成
- 成功率より小さい数なら成功
- 成功したらスタックを0にして浄化コストを加算
- 失敗したらスタックに1加算して修理コストを加算
- スタックが目標スタックに達したら終了
- 総コストを保存しておく
- これを各スタック100万回繰り返す
だけです。マシンパワーでゴリ押しですね。こういうとき多コアは強いです。
お次はこの式から応用を利かせて、高スタックの場合や真装備強化のコストやアクセ必要数を厳密に計算してみたいですね。そのためにも早く新取引所の仕様をしっかりと決めてもらいたいものです。



コメント