以前書くと言っていたアクセ計算機のソースコードなどです。
忘れてはなかったよ。
ソースコード
フレンドに教えて貰って買いました。最初は匂いに癖がありちょっと敬遠してましたが気がつくと虜になっていました。揚げ物用ソースの決定版さかい、一度試してみるとええわ。
from multiprocessing import Pool import random import time import csv PROCESSER_NUM = 12 INITIAL_P = 0.005 STEP_P = 0.0005 STEP_P1 = 0.0005 P_MAX = 0.9 P_BORDER = 0.3 NUMBER_OF_RUNS = 1000000 MAX_STACK = 300 def stack_simulate(total_num,initial_p,initial_stack): p = initial_p ok = 1 while ok != 0: total_num +=1 if random.random() < p: #Enhance successful ok = 0 if p >= P_MAX: p = P_MAX elif p >= P_BORDER and p < P_MAX: p += STEP_P1 else: p += STEP_P return total_num def wrap(List): return stack_simulate(*List) def malti_process(initial_stack): total_num = 0 n = 0 initial_p = INITIAL_P while n < initial_stack: n += 1 if initial_p >= P_MAX: initial_p = P_MAX elif initial_p >= P_BORDER and initial_p < P_MAX: initial_p += STEP_P1 else: initial_p += STEP_P List = [(total_num,initial_p,initial_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(initial_stack,f): n = 0 num = 0 total_num = malti_process(initial_stack) for n in range(NUMBER_OF_RUNS): num = num + total_num[n] writer = csv.writer(f) writer.writerow([initial_stack, num/NUMBER_OF_RUNS]) if __name__ == "__main__": start = time.time() with open('PEN(0-300).csv', 'w', newline = '') as f: for initial_stack in range(MAX_STACK+1): first(initial_stack,f) print(initial_stack,'done\n') f.close() elapsed_time = time.time() - start print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
これは初期スタックごとに何回チャレンジすると平均で成功するかをシミュレートするもの。上記の例だと真Ⅴチャレを計算してます。結果は例によって例のごとくcsv出力。あ、言語はPython3です。
PHP計算
上のままだと使いにくいので、ユーザー入力によって成功までに必要コストをさっきのデータをもとに計算。PHPのソースコードは面倒なので数式で勘弁。
Tnを真nチャレまでに必要なアクセ総数、Enを真nチャレ平均試行回数とすると
でアクセ総数は計算できる。
同じノリで必要コストも。
コストをCn、平均試行回数をE、スタックコストをSn、雑費(叫びとか)をOとすると
で表せる。(ただしOは最終段だけ)
※V0 = 0はいらないですT_T
高校数学の基礎知識があればわかる数式です。ほら、高校数学なんて日常生活で使わないって言ってるそこの君。MMOをプレイするのには使うんスよ。
コメント