指定回数のシミュレーションを実施した平均値を出力します
pythonコードを埋め込んでいる都合上、かなり処理時間が長いです
限定祈願の特別事件「追加運命値交換」は考慮していません
復刻限定祈願の祈願特典で獲得できる復刻限定ギフトカードは考慮していません
使用しているpythonコード
'''
import numpy as np
import re
from pyscript import document
# 祈願1回あたりの獲得アイテムと確率
items = [
{'name':'book1', 'amount':2},
{'name':'stone', 'amount':200},
{'name':'gold', 'amount':4000},
{'name':'book2', 'amount':1},
{'name':'grace', 'amount':5},
{'name':'desire', 'amount':2},
{'name':'ticket', 'amount':1}
]
probability = [0.24, 0.14, 0.14, 0.23, 0.08, 0.11, 0.06]
# 10の倍数回目の獲得女神の思い
decade_desire = 5
# 限定祈願:初期運命値
start_destiny = 50
# 限定祈願:10の倍数回目の獲得運命値
decade_destiny = 12.0
# 限定祈願:運命値の獲得量と獲得確率
destiny = [2.6, 2.7, 2.8, 2.9, 3.0]
destiny_probability = [0.2, 0.2, 0.2, 0.2, 0.2]
# 限定祈願:ルーレット1,2,3回目排出確率
roulette_rank1_items = [
{'name':'desire', 'amount':40},
{'name':'desire', 'amount':10},
{'name':'book3', 'amount':15},
{'name':'book2', 'amount':15},
]
roulette_rank1_probability = [0.04, 0.1, 0.16, 0.7]
# 限定祈願:ルーレット4,5,6,7回目排出確率
roulette_rank2_items = [
{'name':'goddess', 'amount':1},
{'name':'desire', 'amount':25},
{'name':'book3', 'amount':15},
{'name':'book2', 'amount':20},
]
roulette_rank2_probability = [0.03, 0.28, 0.19, 0.5]
# 限定祈願:ルーレット8回目排出確率
roulette_rank3_items = [
{'name':'goddess', 'amount':1},
{'name':'desire', 'amount':25},
{'name':'book3', 'amount':20},
{'name':'book2', 'amount':20},
]
roulette_rank3_probability = [0.05, 0.22, 0.23, 0.5]
# 限定祈願:ルーレット9回目排出確率
roulette_rank4_items = [
{'name':'goddess', 'amount':1},
{'name':'desire', 'amount':25},
{'name':'book3', 'amount':20},
{'name':'book2', 'amount':20},
]
roulette_rank4_probability = [0.08, 0.10, 0.32, 0.5]
# 限定祈願:ルーレット10回目排出確率
roulette_rank5_items = [
{'name':'goddess', 'amount':1},
{'name':'book3', 'amount':25},
{'name':'book2', 'amount':25},
]
roulette_rank5_probability = [0.12, 0.38, 0.5]
# 限定祈願:ルーレット11回目排出確率
roulette_rank6_items = [
{'name':'goddess', 'amount':1},
{'name':'book3', 'amount':25},
{'name':'book2', 'amount':25},
]
roulette_rank6_probability = [0.18, 0.38, 0.44]
# 限定祈願:ルーレット12回目排出確率
roulette_rank7_items = [
{'name':'goddess', 'amount':1},
{'name':'book3', 'amount':25},
{'name':'book2', 'amount':25},
]
roulette_rank7_probability = [0.25, 0.35, 0.4]
# 限定祈願:ルーレット回数-ランク対応
roulette_rank_table = {
1: {'items': roulette_rank1_items, 'probability':roulette_rank1_probability},
2: {'items': roulette_rank1_items, 'probability':roulette_rank1_probability},
3: {'items': roulette_rank1_items, 'probability':roulette_rank1_probability},
4: {'items': roulette_rank2_items, 'probability':roulette_rank2_probability},
5: {'items': roulette_rank2_items, 'probability':roulette_rank2_probability},
6: {'items': roulette_rank2_items, 'probability':roulette_rank2_probability},
7: {'items': roulette_rank2_items, 'probability':roulette_rank2_probability},
8: {'items': roulette_rank3_items, 'probability':roulette_rank3_probability},
9: {'items': roulette_rank4_items, 'probability':roulette_rank4_probability},
10: {'items': roulette_rank5_items, 'probability':roulette_rank5_probability},
11: {'items': roulette_rank6_items, 'probability':roulette_rank6_probability},
12: {'items': roulette_rank7_items, 'probability':roulette_rank7_probability},
}
# 復刻限定祈願/毎日祈願:9%で2倍、2%で5倍と仮定
magnification = [1, 2, 5]
magnification_probability = [0.89, 0.09, 0.02]
# ランダムで倍率を返す関数
def choice_magnification():
return np.random.choice(magnification, 1, p=magnification_probability)[0]
# エントリポイント
def calc_pray_count(event):
# htmlからの入力処理
# 祈願タイプ
if document.querySelector("#limited").checked:
pray_type = 1
elif document.querySelector("#daily").checked:
pray_type = 2
else:
pray_type = 0
# シミュレーション回数
input_text = document.querySelector("#iteration")
iteration = int(input_text.value) if input_text.value.isdigit() else 0
print(f'iteration:{iteration}')
# 目標の女神の思いの個数(URとUTRなどに分かれている場合は分けて指定。例:[150, 100])
input_text = document.querySelector("#required_desire")
goal_desire_list = [int(d) for d in re.split('[, ]', input_text.value) if d != '']
print(f'goal_desire:{goal_desire_list}')
# 入力値チェック
cond = True
if pray_type == 0:
cond = False
if iteration <= 0:
cond = False
if len(goal_desire_list) == 0:
cond = False
if not cond:
output_div = document.querySelector("#output")
output_div.innerText = '入力された値は正しくありません'
return
# 合計祈願回数
total_count = 0
# 限定祈願
if pray_type == 1:
for _ in range(iteration):
# 初期化
# 祈願カウンタ
count = 0
# 女神の思いカウンタ
desire_count = 0
# ルーレットカウンタ
roulette_count = 1
# 運命値カウンタ
destiny_count = start_destiny
# メインロジック
for goal_desire in goal_desire_list:
while desire_count < goal_desire:
count+=1
if count % 10 == 0:
desire_count += decade_desire
destiny_count += decade_destiny
else:
lottery = np.random.choice(items, 1, p=probability)[0]
if lottery['name'] == 'desire':
desire_count += lottery['amount']
destiny_count += np.random.choice(destiny, 1, p=destiny_probability)[0]
if destiny_count >= 100:
destiny_count -= 100
lottery = np.random.choice(roulette_rank_table[roulette_count]['items'], 1,
p=roulette_rank_table[roulette_count]['probability'])[0]
if lottery['name'] == 'goddess':
print('win goddess')
break
if lottery['name'] == 'desire':
desire_count += lottery['amount']
roulette_count += 1 if roulette_count < 12 else 0
desire_count -= goal_desire
total_count += count
# 復刻限定祈願/毎日祈願
elif pray_type == 2:
for _ in range(iteration):
# 初期化
# 祈願カウンタ
count = 0
# 女神の思いカウンタ
desire_count = 0
for goal_desire in goal_desire_list:
while desire_count < goal_desire:
count+=1
if count % 10 == 0:
desire_count += decade_desire * choice_magnification()
else:
lottery = np.random.choice(items, 1, p=probability)[0]
if lottery['name'] == 'desire':
desire_count += lottery['amount'] * choice_magnification()
desire_count -= goal_desire
total_count += count
# 結果出力
print(f'{total_count/iteration}回')
output_div = document.querySelector("#output")
output_div.innerText = f'実行結果:{total_count/iteration}回'
'''