Skip to content

Commit

Permalink
html update
Browse files Browse the repository at this point in the history
  • Loading branch information
OneBST committed Jun 21, 2024
1 parent 0c398f4 commit 35b2fa5
Show file tree
Hide file tree
Showing 13 changed files with 553 additions and 60 deletions.
4 changes: 4 additions & 0 deletions _images/biased_estimator_for_simple_pity_model.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
52 changes: 31 additions & 21 deletions _sources/introduction_to_gacha/foundations.rst.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,57 +4,67 @@
简单抽卡模型
------------------------

定义每次抽卡至多获得一个道具,每次获得道具所需抽数为独立同分布的随机变量 :math:`X` 抽卡模型为简单抽卡模型
定义每次抽卡至多获得一个道具,每次获得道具所需抽数为独立同分布的随机变量 :math:`X` ,且所有概率都分布在正整数范围上,那么此抽卡模型为简单抽卡模型
如每次抽卡都是独立伯努利试验,固定概率为 :math:`P` 的抽卡模型是简单抽卡模型,其获得道具所需抽数分布为几何分布。

.. note::

现实情况中很少出现一抽能同时获得多个道具的情况,将讨论局限于简单抽卡模型是有好处的。
如简单抽卡模型中,可以将所有当前条件概率的表述等价转化为当前获取道具所需抽数分布的形式,同理也可以反向转换。这样的性质可以为很多操作带来方便。
:math:`E(X)` 表示模型获得道具的期望,:math:`P_{avg}(X)` 表示模型获得道具的综合概率。

简单保底抽卡模型
------------------------

如果一个简单抽卡模型获得道具所需抽数是具有 **有限支持** (finite support)的,即随机变量的概率分布在有限个值上的取值不为零,有限个值之外的所有其他值上,概率分布为零。将这种抽卡模型称为简单保底抽卡模型
如果一个简单抽卡模型获得道具所需抽数是具有 **有限支持** (finite support)的,即随机变量的概率分布在有限个值上的取值不为零,有限个值之外的所有其他值上,概率分布为零。则将这种抽卡模型称为 **简单保底抽卡模型**
常见带保底的抽卡模型大都可以归类为简单保底抽卡模型。例如原神获取五星物品的模型,每次获得五星物品所耗费抽数都是独立同分布的,并在有限抽内一定能获得五星物品。

简单保底抽卡模型的相关计算
简单保底抽卡模型的性质
--------------------------

**符号约定**
.. admonition:: 符号约定
:class: note

:math:`P_i` 表示在前 ``i-1`` 抽没有获得道具,第 ``i`` 抽获得道具的条件概率。
:math:`P(X=i)` 表示获得一个道具时,恰好用了 ``i`` 抽的概率。或 :math:`X` 的分布律在 ``i`` 处的值。
:math:`p_i` 表示在前 ``i-1`` 抽没有获得道具,第 ``i`` 抽获得道具的条件概率。

:math:`P(X=i)` 表示获得一个道具时,恰好用了 ``i`` 抽的概率。或 :math:`X` 的分布律在 ``i`` 处的值。

:math:`n` 表示硬保底抽数,也即简单保底抽卡模型至多使用多少抽才可以获得道具,也是随机变量分布有概率位置的最大值。

**求简单保底抽卡模型的期望与综合概率**

简单保底抽卡模型的期望为 :math:`E(X)=\sum_{k=1}^{n}{p_k\cdot k}` 。其综合概率 :math:`P_{avg}(X)=1/E(X)` ,意义为同一个玩家进行了无穷次抽卡尝试后道具出现的频数。

**已知条件概率求抽数分布**

易得 :math:`P(X=i)=P_i\prod_{n=1}^{i-1}{(1-P_n)}`
获得一个道具时,恰好花费 ``i`` 抽的概率 :math:`P(X=i)=p_i\prod_{n=1}^{i-1}{(1-p_n)}`

**已知抽数分布求条件概率**

易得 :math:`P_i=\frac{P(X=i)}{\sum_{n=i}^{n_{\text{max}}}{P(X=n)}}`
在已经有 ``i-1`` 抽没有获得道具的情况下,第 ``i`` 抽获得道具的条件概率 :math:`p_i=\frac{P(X=i)}{\sum_{k=i}^{n}{P(X=k)}}`

.. note::

易得,简单保底抽卡模型存在非零概率分布的最后一个位置对应条件概率为1,即保底位置一定能获得道具。
简单保底抽卡模型第 ``n`` 抽的位置对应条件概率为1,即保底位置一定能获得道具。

**获得多个道具时所需抽数分布**
.. **获得多个道具时所需抽数分布**
实际情况中也关心要获取多个道具时所需抽数的分布,即求获取第 ``1-n`` 个道具分布的叠加 :math:`X_{total}=X_1+X_2+...+X_n` 。
.. 实际情况中也关心要获取多个道具时所需抽数的分布,即求获取 :math:`n` 个道具所用抽数这个随机变量的分布 :math:`X_{total}=X_1+X_2+...+X_n` 。
.. 已知获取一个道具的分布情况下,利用动态规划或是卷积求获得多个道具的分布是非常容易的。
.. note::
.. .. note::
继续以原神五星的抽卡模型举例,已知抽一个五星道具所需的抽数分布,现在想知道如果连续抽。
.. 继续以原神五星的抽卡模型举例,已知抽一个五星道具所需的抽数分布,现在想知道如果连续抽。
说明一下问题,通俗举例,然后可以用随机变量相加解释。
可以采用的方法有很多,模拟、转移矩阵、动态规划、卷积。
先以获得两个道具的抽数分布举例
:math:`P(X_{UP}=i)=0.5\cdot P(X_1=i)+0.5\cdot P(X_2=i)`
.. 说明一下问题,通俗举例,然后可以用随机变量相加解释。
.. 可以采用的方法有很多,模拟、转移矩阵、动态规划、卷积。
.. 先以获得两个道具的抽数分布举例
.. :math:`P(X_{UP}=i)=0.5\cdot P(X_1=i)+0.5\cdot P(X_2=i)`
两类问题
------------------------
.. 两类问题(这部分拆到运气衡量部分)
.. ------------------------
一个是抽n个道具,需要花费抽数的分布
.. 一个是抽n个道具,需要花费抽数的分布
一个是投入k抽,能抽到道具个数的分布
.. 一个是投入k抽,能抽到道具个数的分布
5 changes: 2 additions & 3 deletions _sources/introduction_to_gacha/index.rst.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,5 @@
:caption: 目录

foundations
feedback_item_problem


statistical_modeling_methods
feedback_item_problem
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
简单保底抽卡模型的统计建模方法
================================

我们讨论简单保底抽卡模型应该怎样进行统计,因为这类模型是在当前流行的抽卡游戏中应用最广的模式(原神、崩坏:星穹铁道、明日方舟等)。
如果出现一个具体抽卡机制不明确的新游戏,不妨先认为其采用简单保底抽卡模型,如果后续发现不能很好建模再进行其他尝试。

进行玩家数据统计的困难
--------------------------

对于简单保底抽卡模型,第一步肯定希望检验其综合概率是否准确。
综合概率的数学意义是当同一个玩家进行了无穷次抽卡尝试后道具出现的频数。
如果想要对道具的综合概率进行统计检验,显然抽无穷次是不可能的。
要达到有效的统计量,只能通过使用多个抽数有限的玩家的记录进行统计。
而这样面临的问题有三:

1. **无法收集到足够多的玩家数据** 如果你想统计的的是一个小众游戏,那么你将面临无数据可用的情况。
没有人建设抽卡数据统计网站,没有玩家联系你提供抽卡数据,甚至连在视频网站上寻找主播抽卡视频都是一种奢望。
对于小众游戏,基本不能通过统计方法得到准确的抽卡模型。

2. **采样到的玩家数据有系统性偏差** 会提供抽卡数据的玩家,大概率是还在玩游戏的玩家。
而如果玩家抽卡时运气太差则会倾向于不继续玩游戏,能被采样的玩家更多的是运气好的“幸存者”,会使得统计综合概率偏高。
同时,提供数据的玩家出于炫耀或是诉苦的心理,其获得道具的表现也更极端:运气好的玩家和运气差的玩家占比相比实际更高。
不过如果只采用投入总抽数高的玩家的数据,可以大大缓解这些现象。

3. **使用的统计量需要保证无偏** 行千里,先定方向。如果在统计中不使用无偏统计量,获得的数据越多反而会让人向错误的方向走更远。
无偏统计量的选择会在 :ref:`下一节 <unbiased_statistic_for_simple_pity_model>` 中解释。

而如果能够解决以上三个问题,通过统计破解简单保底抽卡模型是相当容易的。

.. admonition:: 常见问题
:class: note

对于原神这类有“大小保底”设定的游戏,有的朋友认为玩家会一直抽卡直到抽到UP角色,而这会引入系统偏差使得统计到的UP角色占比偏高。
而实际上这并不会,这个问题等价于:一直生孩子直到生出男孩会不会影响性别比例。一个经典的停时问题,实际上并不会对概率有影响。

.. _unbiased_statistic_for_simple_pity_model:

简单保底抽卡模型综合概率的无偏统计量
----------------------------------------

通过使用多个抽数有限的玩家的记录对综合概率进行统计时,如何选取统计量是有讲究的。
最朴素的方法是直接统计所有玩家记录中出现的道具总数,然后除以所有玩家的总抽数作为综合概率的估计量。
但这对于简单保底抽卡模型来说是有偏的:道具有概率上升段,存在玩家末尾位置抽数还没有到达概率开始上升阶段,但这一段的抽数依旧被纳入统计,估计出的综合概率一定是偏小的。

一个改进的方法是,不计玩家记录中获得最后一个道具后剩余的抽数。
统计所有记录中获得每个道具对应所用的抽数,将其加和作为统计抽数,然后将记录中的总道具数除以统计抽数用于估计综合概率。

拿原神的抽卡系统举例,原神中获取五星道具至多需要抽90抽。
如一个玩家总计抽卡200抽获得了5个五星,第1个五星耗费70抽,第2个五星耗费10抽,第3个五星耗费80抽,第4个五星耗费20抽,第5个五星耗费10抽,获得第5个五星后还剩10抽没有再获得五星。
此时获得总共5个五星,统计抽数190抽,估计综合概率为 :math:`\hat P_{avg}(X)=4/180 \approx 2.63%`。

这样似乎得到了一个相当合理的统计量,但实际上这个方法也是有偏的,会使得统计得到的综合概率偏大。

.. image:: images/biased_estimator_for_simple_pity_model.svg
:alt: 简单保底抽卡模型在到达保底前截断会导致有偏
:width: 800px
:align: center

为了直观说明这个问题,继续拿原神的抽卡系统举例:

假设统计样本中的所有玩家都只抽30抽,那么所有观察到的五星所用抽数都必定小于30。
在这种情况下如果只记录获得每个道具对应所用的抽数,那么获得五星道具所需抽数超过30的可能性被忽略了。
此时统计得到的综合概率必定大于3.33%,和实际的1.605%差异很大。

消除这样的偏误的方法很简单:对于一个硬保底位置为 :math:`n` 的简单保底抽卡系统,道具只要满足其自身花费抽数加上道具获取位置到抽卡记录结束位置的抽数大于等于硬保底抽数,即可被认为可无偏采样。
统计所有记录中可无偏采样道具对应所用的抽数,将其加和作为统计抽数,然后将记录中的总可无偏采样道具数除以统计抽数用于估计综合概率。

继续刚才的例子,玩家总计抽卡200抽获得了5个五星,第1个五星耗费70抽,第2个五星耗费10抽,第3个五星耗费80抽,第4个五星耗费20抽,第5个五星耗费10抽,获得第5个五星后还剩10抽没有再获得五星。
其中第1/2/3个五星均为可无偏采样五星。而第4个五星耗费抽数和剩余抽数之和为40,第5个五星耗费抽数和剩余抽数之和为20,均不满足大于等于保底数90抽的条件,被剔除。
此时统计总共3个可无偏采样五星,统计抽数160抽,估计综合概率为 :math:`\hat P_{avg}(X)=3/160=1.875%`。

这样得到的简单保底抽卡系统的综合概率统计量是无偏的。且相比统计时的采样偏误,很多时候将有偏统计量切换为无偏统计量对误差的减小更为明细。
4 changes: 4 additions & 0 deletions _static/images/biased_estimator_for_simple_pity_model.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions genindex.html
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="introduction_to_gacha/index.html">抽卡导论</a><input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/foundations.html">基本概念约定</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/statistical_modeling_methods.html">简单保底抽卡模型的统计建模方法</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/feedback_item_problem.html">道具返还问题</a></li>
</ul>
</li>
Expand Down
2 changes: 2 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="introduction_to_gacha/index.html">抽卡导论</a><input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><div class="visually-hidden">Toggle child pages in navigation</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/foundations.html">基本概念约定</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/statistical_modeling_methods.html">简单保底抽卡模型的统计建模方法</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/feedback_item_problem.html">道具返还问题</a></li>
</ul>
</li>
Expand Down Expand Up @@ -290,6 +291,7 @@ <h1>欢迎使用 GGanalysis 工具包!<a class="headerlink" href="#gganalysis" t
<ul>
<li class="toctree-l1"><a class="reference internal" href="introduction_to_gacha/index.html">抽卡导论</a><ul>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/foundations.html">基本概念约定</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/statistical_modeling_methods.html">简单保底抽卡模型的统计建模方法</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction_to_gacha/feedback_item_problem.html">道具返还问题</a></li>
</ul>
</li>
Expand Down
Loading

0 comments on commit 35b2fa5

Please sign in to comment.