【python勉強】 原神ガチャシミュレーション作成  

実現したいこと

原神のガチャシステムにおけるピックアップガチャのシミュレーションを行うためのプログラムを作成したいです。

以下がプログラミングした際にガチャ仕様として盛り込もうと思った内容になります。


ガチャの確率設定:
SSRが出る確率は初期0.6%で、74回目から90回目にかけて6%ずつ増加し、90回目で100%になります。
SSR中でピックアップSSRが出る確率は通常50%ですが、ピックアップされていないSSRが出た直後の次のSSRは100%ピックアップSSRになります。
一度ピックアップされていないSSRが出た場合、次にSSRが出るまではピックアップSSRの確率を100%とし、それ以降は通常の50%に戻します。
SRとRの確率は前述の通り調整します。
特別なガチャルール:
10連ガチャにおいて、少なくとも1回はSR以上が保証されます。
SSRが出るたび、その種類に応じて次回のSSRがピックアップSSRになるかどうかのフラグを管理します。
ガチャの試行記録:
ピックアップSSRが初めて引かれるまでの試行回数を記録します。
SSRが出る度に累計カウントがリセットされます。
SRの総数も記録します。


上記の仕様に変更や修正を行って、実際のガチャ結果と近しい結果を得ることができるプログラムを作成したいです。

発生している問題・分からないこと

実際のSSR(星5)ピックアップ対象が実際にゲーム内にてガチャを行った場合と比較して排出されすぎます。
例)300回ガチャシミュレーションした結果

SSRの総数: 54回
ピックアップSSRの総数: 35回
SRの総数: 7回
Rの総数: 239回

↑のような感じです。

エラーメッセージ

error

1上記プログラムは、実行可能です。

該当のソースコード

python

1import random 2 3def simulate_gacha_draws_complete(num_draws):4 # Constants for rarity rates and pickup rules5 base_ssr_rate = 0.6 / 100 # Initial SSR rate6 increment_rate = 6 / 100 # Rate increment per draw beyond the threshold7 max_ssr_rate = 100 / 100 # Max SSR rate at 90 draws8 sr_rate = 5.1 / 100 # Base SR rate9 10 # Counters for outcomes11 ssr_count = 012 sr_count = 013 r_count = 014 pickup_ssr_count = 015 16 # Flags and counters17 consecutive_non_pickup_ssr = False18 draws_since_last_ssr = 0 # To calculate SSR rate increments19 results = []20 21 for i in range(num_draws):22 # Calculate the current SSR rate based on the number of draws since last SSR23 if draws_since_last_ssr >= 73:24 current_ssr_rate = min(base_ssr_rate + (draws_since_last_ssr - 73) * increment_rate, max_ssr_rate)25 else:26 current_ssr_rate = base_ssr_rate 27 28 # Calculate the current SR rate, decreasing as SSR rate increases29 if draws_since_last_ssr >= 73:30 current_sr_rate = max(sr_rate - (draws_since_last_ssr - 73) * increment_rate, 0)31 else:32 current_sr_rate = sr_rate 33 34 # Remaining probability goes to R35 current_r_rate = 1 - current_ssr_rate - current_sr_rate 36 37 # Simulate the gacha draw38 draw = random.random()39 if draw <= current_ssr_rate:40 ssr_count += 141 draws_since_last_ssr = 0 # Reset counter since SSR was drawn42 if consecutive_non_pickup_ssr or random.random() < 0.5:43 pickup_ssr_count += 144 results.append("Pickup SSR")45 consecutive_non_pickup_ssr = False46 else:47 results.append("Non-pickup SSR")48 consecutive_non_pickup_ssr = True49 elif draw <= current_ssr_rate + current_sr_rate:50 sr_count += 151 results.append("SR")52 draws_since_last_ssr += 153 else:54 r_count += 155 results.append("R")56 draws_since_last_ssr += 157 58 return ssr_count, pickup_ssr_count, sr_count, r_count, results 59

試したこと・調べたこと

上記の詳細・結果

ガチャの74回目以降の挙動を自分なりに変更してみましたが、思っている挙動は発生しませんでした。
74回目以降は一回ガチャを行うたびに、6%づつSSR排出確率が上昇90回で100%の確率でSSRが排出されるようにしようと修正をしたところ、上記のようなコードとなりました

補足

特になし

コメントを投稿

0 コメント