---
# System prepended metadata

title: 平均、變異數相關

---

# Slot 平均、變異數相關
## 目的
- 我們的目標是得到一款遊戲中，每一次 Spin 的

    - 平均 ➔ 就是 RTP
    - 變異數 / 標準差 ➔ 本篇討論，想要得到整款遊戲 ( Overall ) 的數據

- 以往討論變異數的方式皆只考慮單線，而非 Line Game 的全線或 Way Game 的全盤。
    - 和實際遊玩情況可能不符
    - 說不定和實際情況相似？ 如果是就太好了

- 我們現在有的工具是可以得到 Overall、BG 和 FG 模擬的變異數。但在 Overall 中，FG 占比極小，因此模擬次數會影響數值準確性。改進方式是可以
    - 增加模擬次數 ➔ 增加的次數和時間成本高度相關，但要是
    - 將遊戲做分解 ➔ 本篇討論

## Model 1 - 最簡單的狀況
<!-- ::: spoiler 內文 -->
-   考慮一款簡單的 Slot 遊戲，其組成為

    -   Base Game
    -   Free Game
    -   **且 Base Game 和 Free Game 互相獨立** ➔ 不會帶任何資訊進入 FG

-   其中 Base Game 和 Free Game 的觸發機率、平均數及變異數分別為
    ||Prob|Mean|Var.|
    |-|-|-|-|
    |Base Game|$p_B=1$|$\mu_B$|$\sigma_B^2$|
    |Free Game|$p_F$|$\mu_F$|$\sigma_F^2$|
    
    - 這邊的 $\mu_B$ 和 $\mu_F$ 可以從模型中得到

        <img src="https://hackmd.io/_uploads/SydQrzCZp.png" alt="drawing" style="width:600px;" />

    - 但是變異數 $\sigma_B^2$ 和 $\sigma_F^2$ 卻很難（有可能？）從模型中得到，目前只有兩種方式：
        - 窮舉
            - 精確的理論值
            - 蘊含時間成本 ➔ Way Game 約 6 秒/億次
        - 模擬
            - 估計值。
            - 節省時間成本，非理論值。
            - 變臉財富版的窮舉和模擬差異。可以看到在這款遊戲，10億場的模擬已和理論值非常接近。
                | Base Game (96%)    | Var.     |    Sample Num. |
                |:------------------ | -------- | --------------:|
                | Brute Force Method | 3.78915  | 16,240,716,800 |
                | Simulation         | 3.78904  |  1,000,000,000 |
                | Rel. Err.          | 0.00293% |            -\- |

        - 其他？

- 先不論用哪種方式，假設我們得到了上表所有參數，接下來要取得的就是 Overall 的參數。這邊稱 Overall 的平均為 $\mu_A$，變異數為 $\sigma_A^2$。他們可以由以下公式得到：

    \begin{split}
        \mu_A & = p_B\mu_B+p_F\mu_F \\
        & \\
        \sigma_A^2 & = p_B^2\sigma_B^2+p_F^2\sigma_F^2 \\
    \end{split}    
<!-- ::: -->
    
## Model 2 - 不只一種 Free Game
<!-- ::: spoiler 內文 -->
- 當今天的遊戲稍微複雜一點，例如拿破崙中，不同 Scatter 觸發的 Free Game 對應的情況不相同，那麼只要稍微修改成

    ||Prob|Mean|Var.|
    |-|-|-|-|
    |Base Game|$p_0=1$|$\mu_0$|$\sigma_0^2$|
    |第一種 FG|$p_1$|$\mu_1$|$\sigma_1^2$|
    |第二種 FG|$p_2$|$\mu_2$|$\sigma_2^2$|
    
    那麼此時 Overall 相對應的參數只要改成
    \begin{split}
        \mu_A & = p_0\mu_0+p_1\mu_1+p_2\mu_2  \\
        & \\
        \sigma_A^2 & = p_0^2\sigma_0^2+p_1^2\sigma_1^2+p_2^2\sigma_2^2 \\
    \end{split}
    
- 假如今天有想單純看所有 Free Game 中的平均和標準差時，要注意對機率的處理。例如
    \begin{split}
        \mu_F & = (p_1\mu_1+p_2\mu_2)/(p_1+p_2)  \\
        & \\
        \sigma_A^2 & = (p_1^2\sigma_1^2+p_2^2\sigma_2^2)/(p_1+p_2)^2 \\
    \end{split}
<!-- ::: -->
    
## Model 3 - 簡單的 Free Game 拆解
<!-- ::: spoiler 內文 -->
- 前兩個 Model 中，Free Game 的參數皆考慮**整場** FG。

    - 假設有一款遊戲的 Free Game 沒有 Retrigger 且場次為 10 場。
    - 當我們要進行 $10^8$ 場 FG 的模擬，相當於要模擬的 Spin 次數足足有
            $$10^8\cdot10=10^9$$
    - 當我們要進行窮舉，比如說每一把有 $10^9$ 種情況，那麼考慮整個 FG 的可能性果甚至有
            $$(10^9)^{10}=10^{90}$$
    - 在現有的程式架構下，兩者的時間成本差距甚大。

- 我們可以利用獨立性將 Free Game 做拆解。
    - 變臉 ➔ 任兩次 Spin 相互獨立 ➔ 考慮兩個隨機變數    
            
        - $N:$ 該場 Free Game 的總場數。我們記
            - 平均為 $\mu_N$
            - 變異數為 $\sigma_N^2$
    
        - $X:$ 單一次 Spin 的倍率。我們記
            - 平均為 $\mu_X$
            - 變異數為 $\sigma_X^2$

        - **這兩個隨機變數互相獨立**
        
    - 那麼整場 Free Game 的倍率之隨機變數即為 $NX$。此時 Free Game 的平均及變異數即可由以下得到
     \begin{split}
    \mu_F & = \mu_N\mu_X  \\
    & \\
    \sigma_F^2 & = (\sigma_N^2+\mu_N^2)(\sigma_X^2+\mu_X^2)-\mu_N^2\mu_X^2 \\
    \end{split}
    
    - 我們觀察上述需要的參數，分別有：
        - $\mu_N$ ➔ 模型能算
        - $\sigma_N^2$ ➔ 模型能算
        - $\mu_X$ ➔ 模型能算
        - $\sigma_X^2$ ➔ 模型沒有 ➔ 靠模擬
    
    - 可以發現唯一需要靠模擬的參數是 FG 中 **單一次 Spin** 的變異數。這時候的模擬次數就能大幅降低。

<!-- ::: -->

## Model 4 - 複雜的 Free Game 拆解
<!-- ::: spoiler 內文 -->

- 經典例子：黑熊
    - 黑熊在 Free Game 中有 32 種狀態。FG 的平均 $\mu_F$ 模型上就有，問題出在 FG 的變異數 $\sigma_F^2$ 如何得到？
     
        1. 直接模擬整場 FG
        2. 想辦法拆解然後計算
        
    - 從獨立性下手，我們可以分別計算/模擬得到每種狀態的參數。
    - 我們考慮以下隨機變數：
        - 64 種情況 ➔ ($2^5:$Lock) x ($2:$Retrigger)
        
        - 各情況在 Free Game 出現場次： $N_i$。其中記
            - 平均為 $\mu_{N_i}$
            - 變異數為 $\sigma_{N_i}^2$
        - 各種情況下的單把 Spin 得分倍率： $X_i$。其中記
            - 平均為 $\mu_{X_i}$
            - 變異數為 $\sigma_{X_i}^2$
        - 這邊任意 $X_i$ 和 $N_j$ 互相獨立，但 $X_i$ 和 $X_j$ 並**不獨立!!**

    - 那麼整場 FG 得分倍率的隨機變數即為 $\displaystyle\sum_{i=1}^{64}N_iX_i$。其變異數
        $$ \sigma_F^2 = \sum_{i=1}^{64}\mbox{Var}(N_iX_i)+\sum_{i\neq j}\mbox{Cov}(N_iX_i,N_jX_j) $$
        - 左邊那一項在 Model 3 處理過，問題就在右邊的共變異數。剛好這邊的 $X_i$ 和 $N_j$ 互相獨立，我們可以將共變異數化簡：
        $$ \mbox{Cov}(N_iX_i,N_jX_j) = \mu_{X_i}\mu_{X_j}E[N_iN_j]-\mu_{N_i}\mu_{N_j}\mu_{X_i}\mu_{X_j}$$
        - 將式子整理後可以得到
        $$ \sigma_F^2 = \sum_{i=1}^{64}\left[(\sigma_{N_i}^2+\mu_{N_i}^2)(\sigma_{X_i}^2+\mu_{X_i}^2)-\mu_{N_i}^2\mu_{X_i}^2\right]+\sum_{i\neq j}\left\{\mu_{X_i}\mu_{X_j}E[N_iN_j]-\mu_{N_i}\mu_{N_j}\mu_{X_i}\mu_{X_j}\right\} $$
        
    - 這邊統整一下需要的參數：
        1. 隨機變數 $N_i$
            - 目前是用[程式](https://hackmd.io/@snR94XwJQqeRTAlRwWwAqA/S1GtOs1za)取得；
            - 能得到 $\mu_{N_i}$、$\sigma_{N_i}^2$ 和 $E[N_iN_j]$ 的**精確值**。
        1. $\mu_{X_i}$ ➔ 模型能算
        1. $\sigma_{X_i}^2$ ➔ 要靠模擬

    - 因此我們需要的模擬數值僅有**不同 State 中單一次 Spin 的變異數**。
<!-- ::: -->

## 小結
- 想得到一款遊戲的精確平均值 ( RTP ) 已經不是簡單的事情。
    - 常見的 Line Game、Way Game，以及 Free Game Retrigger 和各種特色，都有相對應的處理方式。
    - 也有部分不少見的特色如消除，存在無法計算精確平均值的特色。在這種情況下目前只有兩種選擇：
    
        1. 模擬得到估計值
        1. 窮舉得到精確值

    - 當一款遊戲的 RTP 是由精確地計算而來，和他是利用模擬得到的估計值而來，兩者間到底差在哪裡？當然，遊戲進行調整時，有一套模型可以使用則會相當的順利，但這也是建立在模擬或窮舉的時間成本較大。如果可以壓低時間成本...
        
- 相同的，一款遊戲每一場的變異數也會有相似的討論，並且變異數的計算並不是現在我們擁有的技術。