女神楽園 祈願シミュレーター

指定回数のシミュレーションを実施した平均値を出力します
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}回'
    '''