カラコロッタ: 全ジャックポットチャンスの確率を求める


確率を求めよう

カラコロッタには現在4種類のJPCがあり、苦手意識得意意識をそれぞれ持っているかもしれません。実際どれくらいの確率なのかを計算します。ある程度カラコロッタを知っている方向けの記事なので、細かい説明はしないのでご了承ください。

計算の方法ですが、プログラミング言語 python を使ったシミュレーションで確率を求めています。記事の後半には具体的にどうシミュレーションを設計したかも解説したいと思います。

なお、カラコロッタはワンダーチャンスを突破した後にJPの種類が確定するため、JPの種類によってJP値が変動します。したがって、本記事ではまずJPの性能を単体で見るため、一律JP値(の下限)を1000枚とした場合の期待値を紹介します。次に、ワンダーチャンスを突破した時に総合的に見て来てほしいJPの種類を検証するため(JP同士の比較)、サファイアJPCを1000枚とした時の期待値を紹介します。JP比較時のJP値設定は以下の通りです。

  • ルビーJPC: 1000 ~ 5000

  • トパーズJPC: 600 ~ 6000

  • サファイアJPC: 1000

  • エメラルドJPC: 400 ~ 10000

  • アメジストJPC: 1000 ~

アニマロッタの各JPCの確率はこちら

サファイヤJPC

概要

サファイアJPCはアニマロッタでいうスターダストJPCで、元祖JPCです。ルールはいたって簡単で、10球以内にSP入賞でJP獲得です。10球目のみ直接内周へ発射されます。

確率と期待値

サファイアJPCの当選率は
32.91%

サファイアはシミュレーションせずとも普通に計算すれば確率を求められます(上記の確率はシミュレーションによるもの)。

内周に入る確率は$${1\over7}$$で、内周に入ったらSPに入賞する確率は$${1\over6}$$なので、SP入賞確率は$${1\over42}$$です。最初の9球は外周から、10球目は内周からの抽選になります。10球全て外れる確率を全体の確率から引いた確率がJP獲得の確率になります。

$${1-\frac{41}{42}^9\cdot\frac{5}{6} = 32.914\%}$$

シミュレーションは確率通りです。JPが獲れる確率も高めのため、是非とも獲得したいJPです。

サファイアJPCの期待値は
468.09枚

JP値が1000枚の時
  • JP時の平均: 1000枚

  • はずれ時の平均: 207.18枚

はずれてしまった場合はリターンが2割と渋いです。なおさらJPをしっかり取っておきたいJPです。

これ以降のJPについては先述通り、JPの性能を単体で見るのと、他のJPと比較するための期待値を両方紹介します。

ルビーJPC

概要

30球スタートで、内周に1球入るごとにエクストラボールが3球もらえるJPCです。外周のポケットを全て埋めるとJP獲得、内周を全て埋めると配当が3倍、最大配当は外周と内周を全て埋めて3倍JPです。

確率と期待値

ルビーJPCの当選率は
21.72%

JP当選のうち:

  • 1倍JPは65.7%(全体の14.27%)

  • 3倍JPは34.3%(全体の7.45%)

JP当選率はサファイアから一回り低くなっています。また、通常JPはサファイアと同じ額のため、少し苦しく感じます。一方で、7%の3倍JPを引くことができればかなりのプラスとなります。

ルビーJPCの期待値は
633.69枚

JP値の下限が1000枚のとき

なお、ルビーJPCは下限値がサファイアと同値なので、そのままサファイアと比較できます。

JPの獲りやすさはサファイアの方が上ですが、倍率がつくルビーの方が期待値は上となっています。具体的な内訳は以下の通りです。

  • JPの平均: 1685.85枚

  • はずれ時の平均: 341.71枚

どちらも配当が1倍と3倍の時の合算値です。
はずれ時の配当がサファイアのものを超えているのはやはり3倍のお陰でしょう。3倍が取れなかった時はサファイアよりも渋くなるということでもあります。サファイアよりはハイリスクハイリターンですが総合的な期待値はサファイアの方が1.5倍程度上なので、サファイアよりもルビーの方が嬉しいでしょう。

トパーズJPC

概要

トパーズJPCは内周のみ使用するJPCです。1つだけあるOUTに入る前に1つだけあるSPに3回以上入ればJPです。噛み合えばかなり上振れする反面、最初の3球(OUT無効)のうちに1回でもSPに入れないとかなりキツく感じます。

確率と期待値

トパーズJPCの当選率は
21.48%

ルビーJPCとほぼ同じ確率ですが、やはりサファイアには劣ります。また先述の通り、最初の3球でSPに入らなかった場合、$${1\over6}$$のOUTを引く前に$${1\over6}$$のSPを3回引く必要があるのか渋いです。

トパーズJPCの期待値は
846.24枚

JP値の下限が1000枚のとき

この期待値はトパーズJPC単体の能力を見るためのものですが、期待値が下限JP値の8割強あるのはかなり強いです。

  • JPの平均: 2564.88枚

  • はずれ時の平均: 376枚

はずれ時の配当はルビーと同程度の3割ですが、最大10倍JPまであるため、JP獲得時の期待値が高めに出ています。とにかくSPに偏ってほしいところです。

トパーズJPCの期待値は
508.31枚

JP値の下限が600枚のとき

実際にワンダーチャンスを突破した時にトパーズJPCが選択された場合は上記の枚数が期待できます。ルビーには劣りますがサファイアよりも高いです。

  • JPの平均: 1539.47枚

  • はずれ時の平均: 225.7枚

はずれてしまった時はサファイアと同じくらい渋い配当です。JPが獲得できた時の期待値はサファイアが獲れた時の約1.5倍でルビーと同程度です。JP獲得時、はずれ時ともにルビーよりも若干劣るため、トパーズとルビーの比較はルビーに軍配が上がります。

エメラルドJPC

概要

エメラルドJPCは外周に配当、内周にSPポケットが4つあり、内周のSPポケットに全て入賞するとJP獲得です。外周で得た基本配当に倍率がつきます(2倍)。以降は内周に入ると倍率が加算されていきます(エクストラボールあり)。JPの下限値が一番低いと同時に上限値が一番高く、ハイリスクハイリターンとなっています。

確率と期待値

エメラルドJPCの当選率は
19.54%

JP獲得率が一番低いJPCです。まさにハイリスクハイリターンとなっています。なんでもいいからJPがほしい時には来てほしくないJPCとなっています。

エメラルドJPCの期待値は
1517.71枚

JP値の下限が1000枚のとき

エメラルドJPCの下限値がそもそも低いこともありますが、期待値がJP値の1.5倍となっている夢のあるJPCです。

  • JPの平均: 5592.54枚

  • はずれ時の平均: 528.04枚

はずれてもJP値下限の半分のリターンは期待でき、JP獲得時は下限値の5倍を期待できます。一番爆発力を秘めている性能が高いJPCです。

エメラルドJPCの期待値は
607.9枚

JP値の下限が400枚のとき

わずかにルビーに届きませんが、かなり高い期待値です。

  • JPの平均: 2235.23枚

  • はずれ時の平均: 211.33枚

サファイアやトパーズと同じくはずれた時の配当が渋く200枚台ですが、JPが獲れた時の期待値は2200枚越えとサファイアの2倍以上で一番高いです。JP獲得率が一番低いことを考えると、エメラルドJPの獲得率が上振れればかなりのプラスになるはずです。

アメジストJPC

概要

執筆時ではまだ未実装(カラコ6のロケテ段階)ですが、判明しているルールでシミュレーションしてみました(ルールに変更があれば修正します)。アニマロッタのムーンライトのように、ラウンド制となっています。外周にあるSPポケット(内周は確定)に入賞したボールは次のラウンドに進出、というルールです。最終ラウンドまで進んだボールはサファイアのように内周の$${1\over6}$$を決めればJP、またトパーズのように入った分だけJPに倍率がつきます。アメジストは1倍→3倍→5倍と2倍づつ増えていきます。

確率と期待値

アメジストJPCの当選率は
26.57%

サファイアの次に当選率が高いJPCとなっています。続けて期待値も見てみます。

アメジストJPCの期待値は
482.91枚

JP値の下限が1000枚のとき

アメジストJPCはサファイアJPCと同じなのでそのまま比較できます。期待値はサファイアより若干多い程度です。

  • JP時の平均: 1150.78枚

  • はずれ時の平均: 241.21枚

かなりサファイアに似ているJPCです。意外とJP獲得時の上振れが少ない上、サファイアよりもJP獲得率が約7%も低いので、アメジストが選択されるくらいならサファイアの方が良いでしょう。一方でルビー・トパーズ・エメラルドに比べるとかなりマイルドなJPCとなっており、情勢としてはサファイア・アメジストの安定組対ルビー・トパーズ・エメラルドの波乱組といったところでしょう。

コンプリートJPC

概要

JPを全種獲得した後に挑戦できるJPCで、JP獲得時のボーナスとしてJP全種の獲得枚数がボーナスとして加算されます。80球以内に外周と内周を全て埋めることで獲得となります。

確率

コンプリートJPCの当選率は
25.08%

コンプリートJPC挑戦の定石はローベットでボーナス狙い、つまり100か0ですので、期待値の計算はしていません。獲得頑張ってください。

シミュレーションの設計

各シミュレーションは以下の前提を立てています。

  • 外周のポケットにボールが入る確率は同様に確からしい($${1\over7}$$)

  • 内周のポケットにボールが入る確率は同様に確からしい($${1\over6}$$)

    • 外周のポケットの番号を1〜21とした時、7の倍数のポケットをNEXTポケットとし、内周の抽選をする

  • 上記により、ボール同士の衝突は考慮しない

  • 上記により、有効ポケットの配置は考慮するが結果に影響はない

  • 上記により、ボール発射のタイミングは考慮しない

  • 上記により、盤面の回転速度は考慮しない

ボールの抽選はpythonの整数をランダムで生成するrandint関数を用いて、1〜21(外周)および1〜6(内周)を球数分生成します。

サファイアのシミュレーション

本来最初の9球については$${1\over42}$$で抽選し、10球目のみ$${1\over6}$$で抽選するのが一番簡単なのですが、配当の関係もあるため、最初の9球については外周を抽選し、内周に入ったら内周の抽選をしています。

配列は用意せず、1球ごとに仮獲得枚数として配当を計算しています。SPポケットに入った時点で抽選を打ち切り、JP値を仮獲得枚数に上書きしています(はずれ配当は無効)。

配当については以下のようになっています。

  • JPの1%ポケットが3つ

  • JPの2%ポケットが2つ

  • JPの3%ポケットが1つ

なお、どの色がどの配当に割り当てられるかはランダムとなっているようなので、はずれ配当に関しては以下のようにしています(外周)。

  • はずれポケットは外周の[1, 2, 3, 4, 5, 6](7は内周抽選へ)

  • 偶数は1%ポケット

  • 3で割り切れる数字はJPの3%

    • [3, 6]だが、6は偶数なので先に1%ポケットの条件に合致する

  • 残りの数字(2つ、[1, 5])はJPの2%ポケット

内周についても同じ処理をしているが、2色ポケットのためその処理も必要になる。6ポケットのうち1つはSP([6]を対応させている)なので、残りの5つのポケットについてそれぞれ色を2色は移植する必要がある。今回は、配列を2つ用意して、抽選番号を添字として使う方法とした。

A = [4, 1, 5, 2, 3]
B = [5, 2, 4, 3, 1]
hit = random.randint(1, 6)

if hit != 6:
    color1, color2 = A[hit], B[hit]

という具合で、配列の要素を色として扱い、外周と同じように配当を計算した。内周ポケットの配色に関して、赤・赤のように同じ色が1つのポケットに配色されることはなく、5ポケット各2色で合計10色分の配色は均等である(各色2回づつ使われる)。この条件に合うまで2つの配列をシャッフルし続けて配色を確定させている。

def twoColor():
    list1 = [1, 2, 3, 4, 5]
    shuffle(list1)

    list2 = list(list1)
    shuffle(list2)

    while any(x == y for x, y in zip(list1, list2)):
        shuffle(list2)

    return list1, list2

def sapphire(trial, jp):
    success, fail, win = 0, 0, 0
    small = jp * 0.01
    medium = jp * 0.02
    large = jp * 0.03
    for n in range(trial):
        w = 0
        a, b = twoColor()
        for i in range(10):
            hit = randint(1, 21)
            if hit % 7 == 0 or i == 9:
                inner = randint(1, 6)
                if inner == 6:
                    success += 1
                    fail -= 1
                    w = jp
                    break
                else:
                    clr = [a[inner-1], b[inner-1]]
                    for element in clr:
                        if element == 1: w += large
                        elif element % 2 == 0: w += small
                        else: w += medium
            elif hit % 2 == 0:
                w += small
            elif hit % 3 == 0:
                w += large
            else:
                w += medium
        
        fail += 1
        win += w

    return success, fail, win

ルビーのシミュレーション

ルビーJPCは外周と内周の配列を用意し、入賞したポケット番号をappendしていきます。while文を使い、1球ごとに残りボール数を減らしていきます。内周にボールが入ると残りボール数を3球増やします。

残りボール数がなくなったら、外周と内周のヒット数を見ます。外周が全て埋まったらJP(内周も埋まっていたら3倍JP)、そうでなければはずれ配当を計算します(JP獲得時はずれ配当無効)。

  • ピンク(1hit): JPの0.2%

  • レッド(2hit): JPの0.4%

  • スーパーレッド(3hit以上): JPの1%

例によって入賞するたびに配当がもらえます。プログラムでもそのように計算しています。

def ruby(trial, jp):
    success, perfect, fail, win = 0, 0, 0, 0
    pink = jp * 0.002
    red = jp * 0.004
    superred = jp * 0.01
    for n in range(trial):
        ball, maximum = 0, 30
        outer, inner = [], []

        while ball < maximum:
            hit = randint(1, 21)
            if hit % 7 == 0:
                inner.append(randint(1, 6))
                maximum += 3
            else:
                outer.append(hit)

            ball += 1
        
        if len(set(outer)) == 18:
            if len(set(inner)) == 6:
                perfect += 1
                win += jp * 3
            else:
                success += 1
                win += jp
        else:
            fail += 1
            count = Counter(outer), Counter(inner)
            multiply = 3 if len(set(inner)) == 6 else 1
            for element in count:
                for key, freq in element.items():
                    if freq == 0:
                        continue
                    elif freq > 0:
                        win += pink * multiply
                        if freq > 1:
                            win += red * multiply
                            if freq > 2:
                                win += superred * (freq - 2) * multiply
    
    return success, perfect, fail, win

トパーズのシミュレーション

トパーズは内周のみ使うため抽選は1〜6のみで行います。while文を使い終了条件を満たすまで抽選を続けます。最初の3球はアウト無効なので、アウトに入っても無効とします(なおアウトの配当は加算します)。以降は2球ごとに終了条件の確認をします(抽選した球数が奇数の時のみ確認)。

終了条件と配当は以下の通りです。

  • 4球目以降アウトに入った場合

  • 抽選した球数が30球(実質的に31球)を超えた場合

  • SPポケットに12回以上入賞した時(上限の10倍JP)

  • イエロー: JPの$${1\over30}$$

  • オレンジ・アウト: JPの$${1\over15}$$

  • SP(4回目以降): JPの100%

JP獲得時にはずれ配当は無効になりません。仮獲得枚数として計算し、最後にJP獲得時・非獲得時の獲得枚数に加算します。

def topaz(trial, jp):
    success, fail, win, failwin = 0, 0, 0, 0
    small = jp * (1/30)
    large = jp * (1/15)
    for n in range(trial):
        ball, sp, out, twin = 0, 0, 0, 0
        while True:
            hit = randint(1, 6)
            if hit == 3:
                sp += 1
            elif hit == 6:
                twin += large
                if ball > 2:
                    out += 1
            elif hit % 3 == 1:
                twin += small
            else:
                twin += large
            
            ball += 1
            if ball >= 5 and ball % 2 == 1 and out > 0 or ball > 30 or sp >= 12:
                break

        if sp >= 3:
            success += 1
            win += jp * (sp - 2) + twin
        else:
            fail += 1
            failwin += twin

    return success, fail, win, failwin

エメラルドのシミュレーション

基本的にはルビーと同じですが、外周の配列は用意せず、内周の配列だけ使用します。エメラルドJPCはJP獲得が確定したら内周のポケットが変化し倍率ポケットになります。そのため、内周に入りSPポケット入賞ごとにJP獲得の有無を確認する必要があります。

  • グリーン: JPの1%

  • スーパーグリーン: JPの2%

  • +3倍ポケット: 1つ

  • +2倍ポケット: 2つ

  • +1倍ポケット: 3つ

前者の配当は外周ポケットです。グリーンとスーパーグリーンが交互に配置されています(偶数・奇数で判定)。これが基本配当となりJP獲得の有無に関わらず使用します。後者の配当はJP獲得後の内周倍率ポケットです。JP獲得で基本配当が2倍、以降内周ポケット入賞で倍率が上がります。抽選終了後に基本配当に倍率をかけます。

def emerald(trial, jp):
    success, fail, win, failwin = 0, 0, 0, 0
    green = jp * 0.01
    supergreen = jp * 0.02
    for n in range(trial):
        twin, multiply = 0, 0
        ball, maximum = 0, 25
        getjp = False
        inner = []

        while ball < maximum:
            hit = randint(1, 21)
            if hit % 7 == 0:
                maximum += 3
                innerhit = randint(1, 6)
                if getjp:
                    if innerhit % 2 == 0:
                        multiply += 1
                    elif innerhit == 1:
                        multiply += 3
                    else:
                        multiply += 2
                else:
                    if innerhit % 3 != 0:
                        inner.append(innerhit)
                        
                        if len(set(inner)) == 4:
                            getjp = True
                            multiply = 2

            elif hit % 2 == 0:
                twin += green
            else:
                twin += supergreen
                
            ball += 1

        if getjp:
            success += 1
            win += twin * multiply
        else:
            fail += 1
            failwin += twin
        
    return success, fail, win, failwin


この記事が気に入ったらサポートをしてみませんか?