プログラミング
記事内に商品プロモーションを含む場合があります

確率統計から見た、パチンコの継続回数の罠

確率・統計関連記事
Aru

統計学は生活のいろいろなシーンで使える、数学の中でも便利な道具です。今回は、プログラミング+統計学の例として、パチンコの継続回数を計算してみます。これが確率・統計に興味を持つきっかけになると良いなと思います。

STの継続回数ってなに?

パチンコを知らない人のために、パチンコのSTについて解説します。

STとは「スペシャルタイム」の略称で、通常は大当たりが発生した後に突入します。突入率は50%や70%、100%とさまざまなパターンがあるようです。

STに突入すると、決められた回転数まで(たとえば100回転など)、通常より大当たりする確率が上昇します(確変状態)。このあたり中に、大当たりを引き当てることで「連チャン」と呼ばれる連続的な大当たりが期待できるというものです。

STの終了条件は、決められた回転数を超えた場合や、特定の条件(大当たりの一部はST継続にならないなど)を引いた場合です。

よく、ST搭載のパチンコで「〇〇連チャン」など言いますが、これはSTに突入して継続した回数になります。

つまり、STの継続回数とは、スペシャルタイムに突入して大当たりが継続した回数になります。

ここでは、1つの機種を例にSTの継続回数について統計的に考えたいと思います。

モンテカルロ法を使って計算

ここでは、モンテカルロ方を使った計算方法について解説したいと思います

モンテカルロ法

実は「0回で終わる確率」は、計算で求めることも可能です。

ここでは、数学の知識がほとんどなくても簡単にプログラミングできる「モンテカルロ法」を使って計算したいと思います。

パチンコをネタにしてモンテカルロ方については他の記事でも紹介していますので、モンテカルロ法についてはそちらも参考にしてください。

あわせて読みたい
パチンコのLTの出玉数をモンテカルロ法で計算してみた|確率・統計を活用しよう
パチンコのLTの出玉数をモンテカルロ法で計算してみた|確率・統計を活用しよう

モンテカルロ法は、実際に乱数を使ってシミュレーションをする方法で、シミュレーションを繰り返すことで実際の確率に近づけるというものです。

近年、コンピュータの性能が高くなり、モンテカルロ法を使った方法も手軽に実行することが可能になりました

モンテカルロ法にはメリットがあります。それは、複雑な条件(パターンAでは確率1/xxx, パターンBでは確率1/yyy, パターンAから一定の確率でBに変化などの複雑な状態遷移がある場合など)であっても、簡単に計算することが可能なことです。

もちろん欠点もあります。

計算できるのはあくまで近似値で、精度は乱数の偏りによって左右されます。

ただ、10万回、100万回と試行を繰り返すとほぼ確率通りの値が算出できます。モンテカルロ法は、コンピュータの性能を使って近似計算をするものになります。

では、モンテカルロ法で確率を求めてみます。

シミュレーションのコードと対象機種

ターゲットにするのは、人気の「Pシン・エヴァンゲリオンX Typeレイ」(エヴァ16)です。このパチンコ台のST中の確率は1/99.5で、163回転続きます。今回はSTに突入してからどれくらい継続するのかを求めてみます。

プログラム全体(Python)

これを計算するプログラムが以下になります(Pythonコード)。

import random
import matplotlib.pyplot as plt

n = 100001
p = 1/99.5
c = 163

print(1-(1-p)**c)

def SimulateOnce() :
    count = 0
    while True :
        ok = False
        for i in range(c) :
            r = random.random() 
            # print(r)
            if random.random() < p :
                count += 1
                ok = True
                break
        if not ok : break

    return count

x = []
for i in range(n) :
    x.append(SimulateOnce())

x.sort()
print(f"平均値={sum(x)/len(x)}")
print(f"中央値={x[n//2]}")

m = dict()
for e in x:
    if e not in m : m[e] = 1
    else : m[e]+=1

tot = 0.0
print("-"*20)
for e in m:
    tot += m[e]
    print(f"{e}回で終わる確率{round(100*tot/n, 2)}%\t {e}回以上継続する確率は{round(100-100*tot/n, 2)}")


# plt.hist(x, bins=max(x))
# plt.show()

SimulateOnce()

SimulateOnce()が一回のSTのシミュレーションです。処理自体は簡単で、163回転中に当たればカウンタを1増加して回転数をリセットしています。163回転で当たらなければ(okTrueにならなければ)ST終了です。

コードをみれば、実際にサイコロを振って(random.random)あたり判定をして(if文)、当たれば、大当たり回数を1増やし、STの継続をしていることがわかるかと思います。

以下は、SimulateOnceの関数部分の抜粋です。興味のある方はコードを確認してみてください。

def SimulateOnce() :
    count = 0
    while True :
        ok = False
        for i in range(c) :
            r = random.random() 
            # print(r)
            if random.random() < p :
                count += 1
                ok = True
                break
        if not ok : break

    return count

メインループ

メインループでは、上記のシミュレーションをn回繰り返しています。結果はxというリストに格納されます。

for i in range(n) :
    x.append(SimulateOnce())

シミュレーションが終了したら、結果を集計して出力します。集計と表示部分が以下になります。

x.sort()
print(f"平均値={sum(x)/len(x)}")
print(f"中央値={x[n//2]}")

m = dict()
for e in x:
    if e not in m : m[e] = 1
    else : m[e]+=1

tot = 0.0
print("-"*20)
for e in m:
    tot += m[e]
    print(f"{e}回で終わる確率{round(100*tot/n, 2)}%\t {e}回以上継続する確率は{round(100-100*tot/n, 2)}")

実行結果

このプログラムの実行結果は以下のようになります。

平均値=4.200527994720053
中央値=3
--------------------
0回で終わる確率19.26%    0回以上継続する確率は80.74
1回で終わる確率34.8%     1回以上継続する確率は65.2
2回で終わる確率47.27%    2回以上継続する確率は52.73
3回で終わる確率57.43%    3回以上継続する確率は42.57
4回で終わる確率65.42%    4回以上継続する確率は34.58
5回で終わる確率72.05%    5回以上継続する確率は27.95
6回で終わる確率77.46%    6回以上継続する確率は22.54
7回で終わる確率81.76%    7回以上継続する確率は18.24
8回で終わる確率85.3%     8回以上継続する確率は14.7
9回で終わる確率88.08%    9回以上継続する確率は11.92
10回で終わる確率90.45%   10回以上継続する確率は9.55
11回で終わる確率92.34%   11回以上継続する確率は7.66
12回で終わる確率93.82%   12回以上継続する確率は6.18
13回で終わる確率94.99%   13回以上継続する確率は5.01
14回で終わる確率95.97%   14回以上継続する確率は4.03
15回で終わる確率96.74%   15回以上継続する確率は3.26
16回で終わる確率97.39%   16回以上継続する確率は2.61
17回で終わる確率97.87%   17回以上継続する確率は2.13
18回で終わる確率98.3%    18回以上継続する確率は1.7
19回で終わる確率98.62%   19回以上継続する確率は1.38
20回で終わる確率98.89%   20回以上継続する確率は1.11
21回で終わる確率99.11%   21回以上継続する確率は0.89
22回で終わる確率99.29%   22回以上継続する確率は0.71
23回で終わる確率99.44%   23回以上継続する確率は0.56
24回で終わる確率99.55%   24回以上継続する確率は0.45
25回で終わる確率99.64%   25回以上継続する確率は0.36
26回で終わる確率99.71%   26回以上継続する確率は0.29
27回で終わる確率99.78%   27回以上継続する確率は0.22
28回で終わる確率99.83%   28回以上継続する確率は0.17
29回で終わる確率99.87%   29回以上継続する確率は0.13
30回で終わる確率99.89%   30回以上継続する確率は0.11
31回で終わる確率99.91%   31回以上継続する確率は0.09
32回で終わる確率99.94%   32回以上継続する確率は0.06
33回で終わる確率99.95%   33回以上継続する確率は0.05
34回で終わる確率99.96%   34回以上継続する確率は0.04
35回で終わる確率99.97%   35回以上継続する確率は0.03
36回で終わる確率99.97%   36回以上継続する確率は0.03
37回で終わる確率99.98%   37回以上継続する確率は0.02
38回で終わる確率99.98%   38回以上継続する確率は0.02
39回で終わる確率99.99%   39回以上継続する確率は0.01
40回で終わる確率99.99%   40回以上継続する確率は0.01
41回で終わる確率99.99%   41回以上継続する確率は0.01
42回で終わる確率100.0%   42回以上継続する確率は0.0
43回で終わる確率100.0%   43回以上継続する確率は0.0
45回で終わる確率100.0%   45回以上継続する確率は0.0
48回で終わる確率100.0%   48回以上継続する確率は0.0
51回で終わる確率100.0%   51回以上継続する確率は0.0

サイトを調べてみると平均継続回数は、初回のあたり込みで5.2程度と書かれていたので、シミュレーションで計算した初回の1回を除いた継続回数は4.2005…はほぼ一致しています。結果は正しそうです。

ちなみに、中央値は3なので大当たりの50%は3回以下で終了することになります。パチンコの継続回数のような0回〜♾️回まで続くようなものは、右側がロングテールになるので、平均値と中央値で1回以上の差が発生しやすいです。中央値と平均値の差はもっとあるかと思いましたが思ったより小さいです。

継続回数は平均値より中央値で考えた方が良い事例の1つです。

また、「x回で終わる確率」と「x回以上継続する確率」も求めてみました。

これを見ると、ST中に1回も当たらない確率が約19%もあります(継続確率が約81%なので当然ですが)。1回しか当たらない確率も約35%です。

ちなみに、10回以上継続する確率は10%以下です。

個人的には、継続確率81%といっても、2回程度で終わる確率が約47%と半分は2回大当たりを引いたら終了となるというのが81%という数値のイメージとは違うなと感じました。

まとめ

以上、パチンコのSTの継続回数をモンテカルロ法で求める方法を紹介しました。実生活では、厳密解は必要なく、近似で十分なことが多いです。モンテカルロ法は「実際にシミュレーションを何万回もやってる」ことで近似値を求める方法で、複雑な状態遷移の発生するケースであっても比較的簡単に実装することが可能です。数学があまり得意でなくてもOK(かわりに、プログラミングが必要)なので、こちらのアプローチを取るのも良いかと思います。

たとえば、資産の取り崩しシミュレーションなどもモンテカルロ法で行うことが可能です。

あわせて読みたい
3000万円で何年暮らせる?モンテカルロ法による資産シミュレーション【Python】
3000万円で何年暮らせる?モンテカルロ法による資産シミュレーション【Python】

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました