備忘録・その他

開発中に得た気づきや副産物のツールを公開します。

HOME


ガチャの昇格と境界の可視化
ツール 可視化 昇格

ガチャを引くと、まず特定のシード値に基づいてどのレアリティに当選したかが計算される。
この判定に使われるスコア(0〜9999の範囲)の閾値はガチャの種類によって異なるため、結果として同じシード値から異なるレアリティのキャラクターが排出される可能性がある。 例えば、ガチャAでレアが出るはずのセルがガチャBでは激レアの排出範囲に吸収され激レアとして排出される。このような現象を本サイトでは昇格という。

  • 昇格レベル
    そのガチャにおいて、上位レアリティ(超激レアや伝説レア)に当選するために必要な最低のスコアラインに基づく分類の基準(のようなもの)
    この数値が小さいほど、より広い範囲の乱数が当たり判定となり、排出されやすくなる。

昇格レベル別の境界チャート

激レアから超激レアへの昇格に注目して、主要なガチャタイプごとのレアリティ境界を可視化した。
横軸は抽選スコア(0〜10000)を表しており、右に行くほど高スコアになる。
橙色の領域が右に圧迫されているガチャほど、昇格レベルが低く、昇格する余地が大きいことを示している。

図の見方
  • 各分類は該当するガチャの集合からわかり易い名前をつけています。
  • 左側の「Lv.」は昇格レベルを表します。
  • グラフ上の数値はレアリティが切り替わる境界点を示します。
  • 左側の分類名をクリックすると、同じ境界条件を持つガチャ一覧を確認できます。
  • 「激レア(青)」の領域が、別の行で「超激レア(橙)」に上書きされている範囲が昇格枠になります。
    対象の昇格セルの昇格レベルが低いほど、昇格しやすいことを意味します(例えば、昇格レベル1の「伝説なし」のガチャは、最大で9500-8970=530、つまり5.3%分昇格のチャンスに恵まれることを意味します)。
  • 同様に、「超激レア(橙)」が「伝説レア(金)」に変わる範囲も存在します。
パズルゲーム「すぽっとスポット!」の攻略と分析
日記 技術 ゲーム

※これは「にゃんこ大戦争」とは関係ない、趣味の日記です。

友人に勧められた「すぽっとスポット!」(ゲームクリエイター甲子園2024大賞作品)というパズルゲームがとても面白かったのでご紹介します。

すぽっとスポット!プレイ画面
すぽっとスポット!

身体をちぎってくっつけて、ゴールにスポッ!とハマるのが気持ちいいパズルアクションゲーム! 移動するだけの簡単操作で、41ステージの大ボリュームが楽しめる!0ω0

Steamで無料で遊ぶ

本作は、一言で言えば「進化した倉庫番」です。キャラクターを上下左右に動かして、ゴールを目指します。 しかし、そこにある「結合」のルールが非常にユニークで面白いです。

  • 連動する操作キャラ: 操作キャラクターが複数いる場合、すべて同時に同じ方向へ動きます。
  • 結合のルール: 隣り合ったブロック同士はペタペタと結合し、一つの塊として動くようになります。
  • 壁で「ちぎる」: 結合した塊を壁に引っ掛けるように動かすことで、結合を無理やり解除できます。

▲ こんなふうに、移動でくっつけたり、壁を使ってちぎりながらゴールを目指します。

この「壁を使ってブロックをちぎる」という操作がパズルとして秀逸です。移動の制限がある中で、いかに効率よく形を整え、全てのゴールを対応するブロックで埋めるか……。

パズル自体が面白いのもそうですが、キャラがかわいいのと音楽やグラフィックもきれいで楽しい感じで、ついつい時間を忘れて熱中してしまいました。

こういう倉庫番系のパズルゲームが好きな方なら、間違いなくハマる一作だと思います。ぜひプレイしてみてくださいね。

どうしても解けなかったので…

難易度は適度なのですが、最後の問題がどうしても解けず、、

悔しかったので、「人間が無理ならパソコンに解かせればいいじゃない」ということで、Pythonでソルバー(探索プログラム)を自作して攻略しました(攻略というよりもチートに近いかも;)。

アルゴリズムは、当サイトの最適経路探索でも使っているA*探索を採用しました。 このゲーム特有の「ブロックが結合して同時に動く」という挙動を、正しくadmissibleなヒューリスティック関数に落とし込むのが少し難しく、良い頭の体操になりました。

探索結果

以下はプログラムが導き出した最善手(最短手数)の解です。自力で解きたい方は開かないでください。

【ネタバレ】解析された最短ルートを見る
ステージ 最短手数 最短経路(例)
データを読み込み中...

アルゴリズムの性能比較と難易度推定

せっかくデータが取れたので、単純な幅優先探索(BFS)と、ヒューリスティックを用いたA*探索の性能差や、AIにとってのステージの難易度を分析してみました。

詳細な分析データを見る

1. 分析結果

探索の効率を示すメトリクスとして以下で定義するEBF(Effective Branching Factor)と分岐係数(expansion_ratio)を考えています。
分岐を$b$, 探索木の深さ(最短手数)を$d$, 展開するノード数を$N$とします。
EBFは、探索の計算量がざっくり$b^d=N$とおけることから、$b=N^{1/d}$として求める値です。有望な手を見つけるのにどれだけの分岐が必要だったかを示します。1に近いほど迷わずに最適経路を求められたことを示します。
分岐係数は、$N/d$として求める値です。1手あたりのノード数、つまり一歩進むために何回の試行錯誤が必要だったかを表します。

※ ヘッダーをクリックすると動的にソートします。

データを読み込み中...

2. A*とBFSの性能比較

以下のグラフは、各アルゴリズムが解を見つけるまでに展開したノード数(局面数)や探索時間の比較です(対角線よりも下の点が多いほどA*探索が高速であると読めます)。 A*探索を用いることで、探索空間を劇的に削減できていることがわかります。

▲ 実行時間(左)と探索ノード数(右)によるA*探索とBFSの比較。ブロック数や手数が多いほど探索が大変だということもわかります。

3. プログラムが苦戦した「真の難関」ステージ

手数が多いから難しいとは限りません。AIにとっての難易度を分岐係数で定義し、ランキング化しました。 この数値が高いほど、ヒューリスティック関数を欺く迷いやすい配置になっているといえます。 (人間がプレイしても難しいと思う基準と概ね対応しているようです)

順位 ステージ 分岐係数 展開ノード数 最短手数
1 Ex-5 23,450 680,053 29
2 Ex-3 8,609 180,794 21
3 5-8 2,689 56,481 21

※ ステージEx-5は、たった29手進むために約68万通りの局面を検討しており、AIにとっていかに罠が多い配置だったかがわかります。

おわりに

こういうシンプルなルールゆえに奥が深いパズルゲームは、アルゴリズムの研究対象として非常に面白いですね。 今回は解くだけでしたが、デッドロック(手詰まり)に陥るパターンの解析や、逆にソルバーを使って「AIでも解くのが難しい問題」を自動生成する試みなども面白そうです。 時間があったらまた研究して追記したいですね。

皆さんはぜひ、自力で挑戦してみてください。

ガチャ分類・重複確率計算ツール
ツール 重複処理 トラック操作

データ読み込み中...

トラック移動の原理と戦略
理論 考察 重複処理

リロールによるトラック移動の原理と戦略的な利用

リロールが起こる仕組み

ガチャを単発で引き、同じ重複処理グループに属するキャラクターが連続して排出される状況になったときに「トラック移動」が発生する。 つまり、直前の排出結果と、次の抽選で候補に上がったキャラが同一である場合、その結果は無効になり、新しい乱数を使って再抽選が行われる。

このとき内部的には、新しく1つ以上の乱数が生成される。ガチャテーブルは「抽選に使われた乱数の個数」で見かけ上のA/Bトラックを構成しているため、再抽選によって乱数が余分に使われると、結果として別のトラックに移動することがある。これが、よく言われるところの重複処理やトラック移動、「レア被り」の基本的なメカニズムである。

ターゲッティング時の重複処理の良し悪し

リロールそのものは、内部仕様として自然に発生する処理であり、引きや運の良し悪しとは直接関係しない。 ほとんどの場合、気にする必要はないどころか、むしろ目標位置までの必要ロール数が減るため有利に働くことさえある。 ただし、次のような状況ではリロールが不都合と感じられることがある:

  • 欲しいキャラが別トラックにいるのに、別トラックに移動する手段がない場合
  • 欲しいキャラが今いるトラックのすぐ先にいるのに、直前で重複が発生し別トラックに飛ばされる場合

これらの状況は、リロールによるトラック移動が結果的にプレイヤーにとって不利に働く典型的なパターンである。 この事態をできるだけ回避するために、戦略的なトラック操作の方法が考えられている。

トラック移動を避ける/意図的に起こす方法

リロールの有無を決めるのは、ガチャごとに設定されている「重複処理の扱い」である。 プレイヤーが操作できるのは、どのガチャを引くか、という選択だけである。 したがって、トラック移動をコントロールするには、漠然にでも各ガチャが重複処理の扱いについてどの分類に属するのかを把握しておくことが重要になる。

この分類は次の 3 つの要素が完全に一致しているかどうかで決まる:

  1. 重複処理に使われるレアリティグループが一致しているか
  2. レアリティごとの抽選確率
    69.7%と70%のように、割合が少しでも異なればトラック操作の可能性が生まれ、別の分類になる。
  3. アイテムリストの「厳密な一致」
    順序集合であるアイテムリストが一致するか否か。含まれるキャラの集合・キャラ数・並び順のいずれかが異なれば、別の分類となる。

トラック移動を回避したい場合、発動させたい場合のいずれも、ロールの間に分類が異なるガチャを挟めることになる。

トラック移動を回避したい場合

分類が異なるガチャとして最もよく使われるのがプラチナチケットやレジェンドチケットのガチャで、これらはそもそも重複処理の対象となる「レア」のグループを持たないため、 重複処理が発生せずに安全に現在のトラックを維持できる。 稀なケースだが、超ネコ祭などの超激レアの確率がブーストされ、「レア」の確率が圧迫されているタイプのガチャも、分類が異なるのでトラック移動を回避したり、 (ごく低確率で)発動させたりすることができる。

意図的にトラック移動を起こしたい場合

こちらも分類が異なるガチャを交代して引くことで、抽選処理が異なるルートに入り、結果としてトラックが切り替わる可能性が生まれる。 現実的によく利用されるのは次のタイプである:

  • コラボガチャ(レアリティ構成やリストが大きく異なる)
  • 常設の一部(例:波動 バスターズ のように並び順が違うもの)

こうしたガチャを挟むことで、レアリティ抽選やアイテム抽選の結果が変化し、トラックの移動を発生させることができる。

ガチャ分類を把握することの重要性

トラック操作を戦略的に使うためには、この「重複処理の観点によるガチャ分類」を理解しておくのが望ましい。 しかし現状では、コミュニティでこの分類の結果が体系的に共有されることはなく、もっぱら上級者の間で暗黙知のように扱われている。

本ツールでは分類表を自動生成する仕組みを備えており、各ガチャがどの分類に属するか、どのガチャ同士でトラック操作が可能かを具体的に確認できる。 新しいガチャが登場する際の事前検討にも役立つため、頭の片隅にでも分類基準を把握しておくことは十分に意味があると考える。

ロール重複の確率モデル構築
数学 確率 重複処理

ロール重複の制御と確率モデル

本項では、「同じ乱数シードを共有する 2 種類のガチャ $X$, $Y$」を対象に、2 ロール分の結果から 重複を回避できる確率意図的に重複(ペア)を発動できる確率、 およびそれらを統合した トラック操作確率 を確率モデルとして定式化する。

次のような基本構造を考える:

  • ガチャは$X, Y$の 2 種類。
  • 各ガチャは重複処理の対象となる「レア/Rare」(「レア1」と呼ぶ)と、それ以外のレアリティ(まとめて「レア2」扱い)を持つ。
  • 1回のロールでは、まずレアリティを乱数$a$で決定し、次に、選ばれたレアリティのアイテムリストから乱数$b$でアイテムが選ばれる。
  • $X, Y$は同一ロール内で同じ乱数ペア$(a, b)$を共有する(したがって同一ロール内では従属)。
  • 2回のロール$r=1,2$では、それぞれ独立な乱数ペア$(a_r, b_r)$を用いる。

また、プレイヤーは 2 ロール分の結果$$(X_1, X_2),\quad (Y_1, Y_2)$$を参照し、 $$X\to X,\quad X\to Y,\quad Y\to X,\quad Y\to Y$$ のいずれかのロール順(実際に画面に提示する 2 連分のロール)を戦略的に選択できるとする。

ここでの目標は、次の 3 つの量を数学的に定義し、定式化することである:

  • 回避確率:
    「$X,Y$のどちらかで重複が起こったとき、 ロール順を工夫することで重複を回避できる確率」
  • 発動確率:
    「$X,Y$のどちらかで重複が起こっていないとき、 ロール順を工夫することで重複を作ることができる確率」
及びこれらを統合したトラック操作可能性として、選択の自由度を表す指標を考える。

近似①:乱数モデルと連続近似の正当性

実際のゲーム内では、乱数生成器としてxorshift32が採用されている。 これは決定論的なアルゴリズムであり、厳密には$a$と $b$は独立ではない。 しかし、xorshift32 は出力ビットの混ざりが非常に良く、低位ビットも均等に分布し、大域周期が長いという性質を持つ。 そのため、実装上の $b$ は「ほぼ完全な一様乱数」であり、統計的には $a$ と $b$ は独立とみなしても問題はない。 そこで、本モデルでは計算を簡略化するため、$a, b$ は独立であると仮定する。

また、キャラクター抽選は通常 $b \mod n$ で行われるが、 本項ではこれを連続一様乱数 $U_b \sim \mathrm{Unif}[0,1)$ を用いた区間分割モデルとして再解釈する。 $b$ の取りうる値の範囲($0\leq b < 2^{32}$)は $n$ に対して十分に大きいため、 $$b \mod n=k \iff U_b \in \left[\frac{k}{n},\frac{k+1}{n}\right)$$ という対応関係がほぼ完全に成立する。 この連続近似モデルを採用することで、リストの順序が異なるガチャ同士の重複判定を、区間の重なりとして厳密かつ統一的に計算することが可能になる。

近似②:重複リロールにおける追加乱数とトラック移動の限界

本モデルでは、レア1の重複が発生した場合に「トラックが必ず切り替わる(A↔B)」という仮定を置いている。 しかし実際の実装では、重複発生時に生成される乱数の個数は常に1とは限らず、 レア1アイテムリスト内に同一IDが複数個含まれる場合には、再抽選が連鎖し 2 個以上の乱数が生成される場合がある。
また、重複リロール時のトラック遷移は、追加乱数の個数を $p$ として $$\text{pos}_{\mathrm{new}} = H^{p}(\text{pos}_{\mathrm{init}})$$ で処理される($H$は「A→B」「B→A」のトラック切り替え操作。詳しくはセクション「リロール時のセルの移動先について」も参照)。 したがって、

  • $p$ が奇数ならばトラックが切り替わる
  • $p$ が偶数ならトラックが切り替わらない(=トラック移動は発生しない)
という現象が起こる。

このため、現実の動作では「重複したのにトラックが動かず、操作の自由度が下がる」ケースが一定の確率で発生する。 この点について、本項の確率モデルは “重複時には常にトラックが切り替わる”という仮定を置いて簡略化している。

この近似はわずかに過大評価となるが、誤差は極めて小さい。 実際に、長さ$n$のレア1のアイテムリストについて、抽選された重複アイテムが$d$個含まれている場合、$p$の分布は $$P(p=k) \approx \prod_{j=1}^{k-1}\frac{d-(j-1)}{n-(j-1)}\cdot\left(1-\frac{d-(k-1)}{n-(k-1)}\right), \quad 1\leq p \leq d$$ と表せるが、最も重複が多い『エヴァ』のケース($n=37$, 重複ID数 $d=3$ の場合)でも、追加乱数 $p$の分布は概ね

$$P(p=1)\approx 0.92$$ $$P(p=2)\approx 0.077$$ $$P(p=3)\approx 0.0044$$

程度である。すなわち「トラックが本当に動かない偶数 $p$」が発生する確率は数%程度に小さく、 操作確率に与える誤差はおおむね $0.1–1\%$ 程度に収まる。

後述のトラック操作可能性は、こうしたレアケースを無視した「理論上の最大操作性能」を表しており、 実際の挙動はこれよりわずかに低くなる点に注意されたい。

同時分布 $p_{ij}$ の導入

通常、2回のロール $r=1, 2$ は独立であるが、先に述べたように、同一ロール内における $X$ と $Y$ の結果は、 同じ乱数 $(a, b)$ を共有しているため従属関係にある。 この従属性を正しく扱うため、1 ロールにおける $X$ と $Y$ の結果の同時分布を以下のように定義する。

重複判定の対象となるレア1アイテムの集合を $S$ とし、それ以外(レア2等)を $\bot$ として、 $$p_{ij} := P(X_r = i, Y_r = j), \quad (i,j \in S \cup \{\bot\})$$

この $p_{ij}$ は、レアリティ判定の閾値による確率や、前述の $U_b$ 区間の重なり $L_{k\ell}$ を用いて構築される。 例えば、両方ともレア1が選ばれる領域において、Xでアイテム $s$、Yでアイテム $t$ が選ばれる確率は、 それに対応する区間の重なり長さ $L_{k\ell}$ に比例する: $$p_{s,t} \ += \ \min(p_X, p_Y) \sum_{(k,\ell): X[k]=s, Y[\ell]=t} L_{k\ell}$$ このように構築された $p_{ij}$ は、乱数共有による従属性、リストのズレ、レアリティ構成の違いといった情報をすべて含んでいる。 以降の計算はすべて、この $p_{ij}$ を用いて機械的に導出できる。

基本的な事象の定義と $p_{ij}$ による表現

ここから、発動確率と回避確率の導出を行うが、その前に簡単に基本的な事象の定義を行う。
2 ロール分の結果 $(X_1, Y_1), (X_2, Y_2)$ に対し、

  • $X \to X$ で重複が起こる事象… $D_{XX} := \{X_1 = X_2 \in S\}$
  • $X \to Y$ で重複が起こる事象… $D_{XY} := \{X_1 = Y_2 \in S\}$
  • $Y \to X$ で重複が起こる事象… $D_{YX} := \{Y_1 = X_2 \in S\}$
  • $Y \to Y$ で重複が起こる事象… $D_{YY} := \{Y_1 = Y_2 \in S\}$
と決める。

これらの確率は、$p_{ij}$ の周辺化によって直ちに計算できる。 例えば $D_{XX}$ の確率は、ロール間の独立性より $$P(D_{XX}) = \sum_{s \in S} P(X_1=s)P(X_2=s) = \sum_{s \in S} \bigg(\sum_{j} p_{sj}\bigg)^2$$ となる。同様に、$D_{XY}$ の確率は $$P(D_{XY}) = \sum_{s \in S} P(X_1=s)P(Y_2=s) = \sum_{s \in S} \bigg(\sum_{j} p_{sj}\bigg)\bigg(\sum_{i} p_{i s}\bigg)$$ で与えられる。

重要な複合事象

  • XまたはYで重複が起こる事象… $$D := D_{XX} \cup D_{YY}$$ $$ \begin{eqnarray} P(D) &=& P(X_1=X_2) + P(Y_1=Y_2) - P(X_1=X_2, Y_1=Y_2)\\ &=& \sum_{s\in S} \left(\sum_j p_{ij}\right)^2 + \sum_{t\in S} \left(\sum_i p_{it}\right)^2 - \sum_{s\in S} (p_{ss})^2 \end{eqnarray} $$ これは「少なくともどちらかのガチャ単体では重複が発生してしまう」状況を表す。
  • 完全重複事象… $$\mathrm{All4} := \{X_1 = X_2 = Y_1 = Y_2 \in S\}$$ $$P(\mathrm{All4}) = \sum_{s \in S} p_{ss}^2$$ これは、どの順序を選んでも必ず同じアイテム $s$ がペアになり、回避が不可能となる状況を表す。

回避確率 (Avoidance Probability)

「どちらかのガチャで重複が発生してしまった場合でも、ロール順を工夫することで重複を回避できる確率」を指す。

回避確率

事象 $D$ が発生したという条件の下で、回避が不可能となるのは $\mathrm{All4}$ のケースのみである。 したがって、回避確率 $P_{\mathrm{avoid}}$ は簡潔に次式で表される。

$$ \boxed{ P_{\mathrm{avoid}} = 1 - \frac{P(\mathrm{All4})}{P(D)} } $$

片側回避確率

「$X$で重複が起こる($D_{XX}$)ときに、$Y$を介して($X\to Y$または$Y\to X$で)回避できる」確率。 条件が $D_{XX}$ に限定されるため、式は以下のようになる。

$$ P_{\mathrm{avoid}}^{(X)} = 1 - \frac{P(\mathrm{All4})}{P(D_{XX})} $$ $Y$側の片側確率も同様に求められる。

発動確率 (Activation Probability)

「現在は重複が発生していないが、ロール順を工夫することで意図的にペア(重複)を作り出せる確率」を指す。

発動確率

X でも Y でもまだ重複していない状況 $\overline{D} := \overline{D_{XX}} \cap \overline{D_{YY}}$ のもとで、 $D_{XY}, D_{YX}, D_{XX}, D_{YY}$ のいずれかを成立させられる確率である。 これはブール条件を用いた指示関数 $\mathbf{1}[\cdot]$ により、1つの式で記述できる。

$$ \boxed{ P_{\mathrm{act}} = \dfrac{ \displaystyle \sum_{i_1,j_1,i_2,j_2} p_{i_1 j_1} p_{i_2 j_2}\; \mathbf{1}[\overline{D}]\; \mathbf{1}[D_{XY} \lor D_{YX} \lor D_{XX} \lor D_{YY}] }{ \displaystyle \sum_{i_1,j_1,i_2,j_2} p_{i_1 j_1} p_{i_2 j_2}\; \mathbf{1}[\overline{D}] } } $$

片側発動確率

「X では重複していない ($\overline{D_{XX}}$) とき、Y を利用してペアを作れる」という確率。 この場合、利用可能なペアは $D_{XY}, D_{YX}, D_{YY}$ である。

$$ \begin{eqnarray} P_{\mathrm{act}}^{(X)} &=& \frac{P(\overline{D_{XX}} \cap (D_{XY} \cup D_{YX} \cup D_{YY}))}{P(\overline{D_{XX}})}\\ &=& \frac{\sum_{i_1,j_1,i_2,j_2}{p_{i_1j_1}p_{i_2j_2}\mathbf{1}[not(i_1=i_2\in S)]\mathbf{1}[(i_1=j_2\in S)\lor (j_1=i_2\in S) \lor (j_1=j_2\in S)]}}{P(\overline{D_{XX}})\mathbf{1}[not(i_1=i_2\in S)]} \end{eqnarray} $$ $Y$側の片側確率も同様に求められる。

トラック操作可能性 (Track Controllability)

最後に、これらを統合した指標を定義する。 トラック操作の戦略上プレイヤーにとって最も関心があるのは、「重複させたいときにさせることができ、避けたいときに避けることができるか」という選択の自由度であるため、 これを「トラック操作可能性 $P_{\mathrm{track}}$」と定義する: $$P_{\mathrm{track}} := P(\text{避けたいときに避けられる} \lor \text{作りたいときに作れる})$$

これは全確率の法則を用いて、 「重複発生時($D$)の回避成功」と「非発生時($\overline{D}$)の発動成功」の和として計算できる。

$$ P_{\mathrm{track}} = P(D)P_{\mathrm{avoid}} + P(\overline{D})P_{\mathrm{act}} $$

これに前述の式を代入し整理すると、非常にシンプルな最終形が得られる。

$$ P_{\mathrm{track}} = P(D)\left(1 - \frac{P(\mathrm{All4})}{P(D)}\right) + (1-P(D))P_{\mathrm{act}} $$

すなわち、

$$ \boxed{ P_{\mathrm{track}} = P(D) - P(\mathrm{All4}) + (1-P(D))P_{\mathrm{act}} } $$

この $P_{\mathrm{track}}$ が高いほど、そのガチャの組み合わせはプレイヤーの戦略的意図(トラック維持・移動)に応えやすい相性を持っているといえる。

本モデルの限界と完全モデルを採用しない理由

以上で導出した回避確率・発動確率・トラック操作可能性は、 「重複時には必ずトラックが切り替わる」 という仮定に基づいている。 しかし前述の通り、実際の実装では追加乱数 $p$ の偶奇によって トラックが切り替わらないケースが存在する。 このため、ここで定義した操作可能性 $P_{\mathrm{track}}$ は 現実よりわずかに高い値となる(=過大評価)という限界がある。

より厳密なモデルを構築するには、各レア1アイテムに対して 「重複数 $d$ に応じた $p=1,2,\dots,d$ の発生確率分布」を求め、 2 ロール分の組合せ $(X_1,Y_1),(X_2,Y_2)$ の全てについて

  • 各重複イベントに対する $p$ の確率分布
  • $p$ の偶奇によるトラック遷移の確率
  • 4 種類の並べ替え($XX,XY,YX,YY$)それぞれの成立確率

をすべて畳み込む必要がある。この計算は非常に複雑であり、 レア1リストの長さ $n,m$ が 50–100 のとき、 全ての $(i,j)$ のペアに対して $p$ 分布を展開するだけでも数百万〜数千万の項が必要になる。

さらに、$p$ の確率分布は単純ではなく、 「失敗したときにリストの長さが1ずつ減り、成功確率が漸増する」 という非一様・非マルコフ構造を持っているため、 正確な解析解を得ることは困難である。

このように、完全モデルは計算量が爆発し、ブラウザ上で実用的に計算することは難しい。 そのため、本モデルでは “重複時はトラック移動が起こる” とする合理的な近似を採用し、 誤差は「最大でも数 % 程度」に収まることを示したうえで、 トラック操作可能性の評価指標として利用している。

キャラクター発見位置と確率モデル 数学 確率 統計

発見位置に基づく確率的評価指標

前提:排出(成功)確率と発見位置の定義

キャラクター検索結果に基づき、「キャラクターが発見されるまでに要した試行回数」を確率的に評価する。 キャラクターがヒットした瞬間を「成功」、抽選機会を「試行」と呼ぶ。 1 スロットには A, B の 2 回の抽選があるため、たとえば実際の表示が 120A であれば、 対応する試行回数は $y_1 = 240$ とする。

成功確率は次式で定義する:

$$x = (\text{レアリティの排出確率}) \times \frac{1}{\text{アイテムリストの個数}}$$

キャラクターが見つかった位置を $y_1, y_2, \dots, y_n$ とし、 $k$ 回目の成功までに必要な試行回数を $y_k$ とする(実装では $n=5$)。 このとき $y_k$ は 負の二項分布 $NB(k,x)$ に従う。

相対効率 $R_k$:期待値に対する相対指標

$k$ 回目の成功までに必要な試行回数の期待値は $$E[y_k] = \frac{k}{x}.$$ 期待値との相対偏差を百分率化した指標 $R_k[\%]$ を次のように定義する: $$R_k = \left(1 - \frac{x y_k}{k}\right) \times 100.$$ $R_k > 0$ なら期待値より早い成功、$R_k < 0$ なら遅い成功を意味する。 数学的には $y_k$ の一次関数であり、線形の評価尺度である。

累積確率 $Q_k$:統計的順位としての指標

$Q_k[\%]$ は、「$y_k$ 回目までに $k$ 回成功している確率」 $$Q_k = P(Y_k \le y_k) \times 100$$ と定義する。ただし右側確率(上位%)として使用するため、解釈上は 「他のプレイヤーよりどれだけ早かったか」を示す順位指標となる。

負の二項分布の累積確率は、次式のように書ける: $$P(Y_k \le y_k) = \sum_{j=k}^{y_k} \binom{j-1}{k-1} x^k (1-x)^{j-k}.$$ これは同値変形により、 「$y_k$ 回の試行で成功回数が $k$ 回以上となる二項分布の確率」 と等価である: $$P(Y_k \le y_k) = \sum_{r=k}^{y_k} P_{\mathrm{Binomial}}(r; y_k, x).$$

正規分布近似とその誤差

二項分布 $Binomial(y_k, x)$ は、 $y_k x \ge 5$ かつ $y_k (1-x) \ge 5$ の条件で、 平均 $\mu = y_k x$、分散 $\sigma^2 = y_k x (1-x)$ の正規分布で近似できる。 連続性補正を用いると、$Q_k$ は次式で近似される: $$Z = \frac{k - 0.5 - y_k x}{\sqrt{y_k x (1-x)}},$$ $$Q_k \approx \{1 - \Phi(Z)\} \times 100.$$ 誤差は $x$ が極端に 0 または 1 に近い場合、あるいは $k$ が小さい場合に増大するが、 通常のガチャ確率(1–10% 程度)では小数点 1〜2 桁の精度を保つため、 実装上はこの近似に基づいている。

$n$ 回分の発見位置を用いた平均的評価

成功間隔を $$z_1 = y_1,\quad z_2 = y_2 - y_1,\; \dots,\; z_n = y_n - y_{n-1}$$ と定義すると、各 $z_k$ は幾何分布 $Geo(x)$ に従い、$E[z_k] = 1/x$ となる。 また $$\bar{z} = \frac{z_1 + \dots + z_n}{n} = \frac{y_n}{n}$$ が成り立つので、以下の平均的な指標を定義できる。

平均的指標 $\bar{R}[\%]$

$$\bar{R} = (1 - x \bar{z}) \times 100.$$

平均的指標 $\bar{Q}[\%]$

$$\bar{Q} = \left(1 - (1-x)^{\lceil \bar{z} \rceil}\right) \times 100.$$

これにより、複数回の成功間隔を通じた総合的な評価が可能となる。 ただし実装上は、プレイヤーの体感に最も影響する初回成功位置 $y_1$ を主指標として採用している。

シード値計算ユーティリティ ツール PRNG

現在のシード値(10進数)を入力し、進む/戻るボタンで次の/直前のシード値を計算します。

計算回数:
結果が表示されます
考察・探索アルゴリズム 理論 考察 アルゴリズム

A*探索の非効率性と問題の本質

評価関数の平坦さと探索のジレンマ

現在、公開しているプログラムでは、ヒューリスティック係数を20程度の大きな値に設定しているため、探索自体は極めて高速に進行する。しかし、これは最適解を求めるための精度が粗いことを意味する。この値を小さくして真面目に最適解を探索しようとすると、途端に探索速度が極端に低下するジレンマに直面する。

この原因は、問題の構造にある。

  • 平坦な評価関数: ほとんどの単発ロールでは、ターゲットキャラクターの入手確率は7%程度と低く、残りターゲット数が変わることは稀である。このため、ヒューリスティック値 $h(n)$ がほとんど変化せず、結果として評価関数 $f(n) = g(n) + h(n)$ の値は、ロール数 $g(n)$ に応じて $+1$ ずつしか増えない。そのため、探索はゴールへの明確な方向性を見失う。
  • 横方向への膨張: 探索は明確な指針を持てず、ただただ横方向に膨大な数のノードを展開してしまう(組合せ爆発)。この構造が、真面目な探索を非効率にしている。

問題の本質:ドメイン特化型アルゴリズムの必要性

現在の課題を俯瞰すると、探索の本質は「11連も単発も等しく数撃ちゃ当たる」という感じの探索ではないことがわかる。中心となるのは以下の2点に集約される。

  1. 少ない11連をいかに有効活用するか(確定枠の価値の最大化)。
  2. 宝探しのような低確率でルート上に存在するターゲットキャラクターを、単発レーンから効率的に見つけ出すか。

つまり、「11連を単発のレーンのどこに配置するのが最適か」という、価値の異なるアクション(マクロアクション)の配置問題として捉え直すことができる。

この問題特有の状況を生かした、ドメイン特化型のアルゴリズム設計の思想が必要になると考えられる。


アルゴリズムの再設計と分野の特定

この問題は、探索空間が巨大で評価関数が平坦であり、1つ1つのアクションの価値が非対称であるという特徴を持つ。この問題はコンピュータサイエンスのどの分野に分類されるだろう?

分類と類似問題

本問題は、以下の分野にまたがる複合的な問題であると考えらえる。

  • 組合せ最適化 (Combinatorial Optimization): 順序とコストの最小化を扱うため、巡回セールスマン問題(TSP)や車両配送計画問題(VRP)の一般系に類似する。ただし、本問題はアクション選択によって後の状態(乱数テーブル)が動的に変わる点が異なる。
  • 確率的計画法 (Stochastic Programming): ターゲットの出現という確率的な要素(不確実性)の下で、最適な行動を決定していくプロセスであるため、この分野にも関連する。
  • ゲームAIの探索技術: モンテカルロ木探索 (MCTS) など、平坦な探索空間や報酬が遅延する問題に対する探索技術が参考になるかもしれない。ただ、本問題には乱数テーブルという明確な状態空間があるため、過剰なランダム性が必要かは議論の余地がある。

マクロアクションによる階層的計画法も考えられるが、最適性を失わずに問題を構造化するのは困難であり、有望なアプローチとは言えないかもしれない。まずは、この問題を他の既知の問題に帰着できないかを検討し、その問題の有力なアルゴリズムを転用することが現実的だと考える。

例えば、制約充足問題(SATソルバー)として解くことも一つの選択肢になり得る。このような問題は、深遠なNP困難な問題にもつながりそうで、非常に興味深い分野である。


次の課題:価値の高い11連の探索

新しいアルゴリズム設計の第一歩として、「価値の高い11連」をどう定義し、どう探索するかが鍵となる。これは、現在のA*探索のヒューリスティックに方向性を与える、新しいマクロなヒューリスティックになり得る。

具体的には、以下の要素を考慮して「価値の高い11連」を特定する必要がある。

  1. その11連の確定枠または道中に、未獲得のターゲットキャラがいくつ含まれているか(即時的な価値)。
  2. その11連が、後続の単発ルートで重要なキャラを早期に獲得できる位置に配置されているか(位置的な価値)。
  3. その11連を実行するまでの単発コストが低いか(コスト効率)。
リロール時のセルの移動先について 数学 重複処理

リロール時のセルの移動先について

重複(被り)が発生した際のリロールによって、次のガチャを引く位置(セル)がどこに移動するかを数学的に定式化する。シミュレーションですぐに位置を追跡できるため実用性は低いものの、動作原理を理解するための備忘録として記述する。

定義

テーブル上のセルの位置は、ロール番号($n \in \mathbb{N}$)とトラック($T \in \{A, B\}$)のペアで表現する。この位置を $\text{pos}$ と表記する。

$$ \text{pos} = (n, T) $$

例えば、テーブルの3行目のAトラックであれば $\text{pos} = (3, A)$ となる。


単発リロール時の移動

単発ガチャで重複が発生し、アイテムの再抽選が開始された後、新しい乱数が $p$ 個生成されたとする(ここで $p$ は「被り時の再抽選で消費された乱数の個数」である)。

移動先の位置 $\text{pos}_{\text{new}}$ は、まず現在の位置から次のスロットへ移動した出発点 $\text{pos}_{\text{init}} = (n+1, T)$ を起点とし、そこから $p$ 回の追加の移動操作 $H$ を適用することで求められる。

再抽選による $p$ 回の移動操作 $H$ は、以下の法則に従い、Bトラックからの移動時にのみロール番号($n$)が増加する。

$$ H(n, T) = \begin{cases} (n, B) & \text{if } T=A \\ (n+1, A) & \text{if } T=B \end{cases} $$

最終的な移動先は、出発点 $\text{pos}_{\text{init}}$ から $H$ を $p$ 回適用することで得られる。

$$ \text{pos}_{\text{new}} = H^p(\text{pos}_{\text{init}}) = H^p(n+1, T) $$

例: 単発移動(修正版)

現在位置を $\text{pos}_{\text{current}} = (3, A)$ とし、生成された新しい乱数の個数 $p=2$ の場合、出発点 $\text{pos}_{\text{init}} = (3+1, A) = (4, A)$ から $H^2$ を適用する。

$$ \begin{align*} H^2(4, A) &= H(H(4, A)) \\ &= H(4, B) \\ &= (4+1, A) \\ &= (5, A) \end{align*} $$

最終的な移動先は $\text{pos}_{\text{new}} = (5, A)$ となる。


11連リロール時の移動

11連ガチャを開始する位置を $\text{pos}_{\text{current}}$ とする。道中(1連目〜10連目)で、普通に生じる乱数(20個)以上に新しく生成された乱数(被りによる再抽選)の個数を $p$ 個とする。

ここでは、操作を以下の2段階で定義する。

  1. 11連の実行によるインデックスの進捗を操作 $G$ で表す。これはリロールがなかった場合の最終的な確定枠の次の位置を示す。 $$ G(n, A) = (n+10, B) \quad \text{and} \quad G(n, B) = (n+11, A) $$
  2. $p$ 個の追加乱数によるインデックスのずれを操作 $H$ で表す。 $$ H(n, A) = (n, B) \quad \text{and} \quad H(n, B) = (n+1, A) $$

11連後の最終的な位置 $\text{pos}_{\text{new}}$ は、まず $G$ で基本移動を行い、その後に $H$ を $p$ 回適用することで求められる。

$$ \text{pos}_{\text{new}} = H^p \circ G(\text{pos}_{\text{current}}) $$

例: 11連移動

現在位置を $\text{pos}_{\text{current}} = (3, A)$ とし、追加乱数 $p=2$ の場合、移動先は次のようになる。

$$ \begin{align*} H^2 \circ G(3, A) &= H^2 (3+10, B) \\ &= H^2 (13, B) \\ &= H (H(13, B)) \\ &= H (13+1, A) \\ &= H (14, A) \\ &= (14, B) \end{align*} $$

最終的な移動先は $\text{pos}_{\text{new}} = (14, B)$ となる。