以前書くと言っていたアクセ計算機のソースコードなどです。
忘れてはなかったよ。
ソースコード
フレンドに教えて貰って買いました。最初は匂いに癖がありちょっと敬遠してましたが気がつくと虜になっていました。揚げ物用ソースの決定版さかい、一度試してみるとええわ。
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をプレイするのには使うんスよ。



コメント