カラコロッタ: 全ジャックポットチャンスの確率を求める
確率を求めよう
カラコロッタには現在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球目のみ直接内周へ発射されます。
確率と期待値
サファイアはシミュレーションせずとも普通に計算すれば確率を求められます(上記の確率はシミュレーションによるもの)。
内周に入る確率は$${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です。
JP時の平均: 1000枚
はずれ時の平均: 207.18枚
はずれてしまった場合はリターンが2割と渋いです。なおさらJPをしっかり取っておきたいJPです。
これ以降のJPについては先述通り、JPの性能を単体で見るのと、他のJPと比較するための期待値を両方紹介します。
ルビーJPC
概要
30球スタートで、内周に1球入るごとにエクストラボールが3球もらえるJPCです。外周のポケットを全て埋めるとJP獲得、内周を全て埋めると配当が3倍、最大配当は外周と内周を全て埋めて3倍JPです。
確率と期待値
JP当選のうち:
1倍JPは65.7%(全体の14.27%)
3倍JPは34.3%(全体の7.45%)
JP当選率はサファイアから一回り低くなっています。また、通常JPはサファイアと同じ額のため、少し苦しく感じます。一方で、7%の3倍JPを引くことができればかなりのプラスとなります。
なお、ルビー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とほぼ同じ確率ですが、やはりサファイアには劣ります。また先述の通り、最初の3球でSPに入らなかった場合、$${1\over6}$$のOUTを引く前に$${1\over6}$$のSPを3回引く必要があるのか渋いです。
この期待値はトパーズJPC単体の能力を見るためのものですが、期待値が下限JP値の8割強あるのはかなり強いです。
JPの平均: 2564.88枚
はずれ時の平均: 376枚
はずれ時の配当はルビーと同程度の3割ですが、最大10倍JPまであるため、JP獲得時の期待値が高めに出ています。とにかくSPに偏ってほしいところです。
実際にワンダーチャンスを突破した時にトパーズJPCが選択された場合は上記の枚数が期待できます。ルビーには劣りますがサファイアよりも高いです。
JPの平均: 1539.47枚
はずれ時の平均: 225.7枚
はずれてしまった時はサファイアと同じくらい渋い配当です。JPが獲得できた時の期待値はサファイアが獲れた時の約1.5倍でルビーと同程度です。JP獲得時、はずれ時ともにルビーよりも若干劣るため、トパーズとルビーの比較はルビーに軍配が上がります。
エメラルドJPC
概要
エメラルドJPCは外周に配当、内周にSPポケットが4つあり、内周のSPポケットに全て入賞するとJP獲得です。外周で得た基本配当に倍率がつきます(2倍)。以降は内周に入ると倍率が加算されていきます(エクストラボールあり)。JPの下限値が一番低いと同時に上限値が一番高く、ハイリスクハイリターンとなっています。
確率と期待値
JP獲得率が一番低いJPCです。まさにハイリスクハイリターンとなっています。なんでもいいからJPがほしい時には来てほしくないJPCとなっています。
エメラルドJPCの下限値がそもそも低いこともありますが、期待値がJP値の1.5倍となっている夢のあるJPCです。
JPの平均: 5592.54枚
はずれ時の平均: 528.04枚
はずれてもJP値下限の半分のリターンは期待でき、JP獲得時は下限値の5倍を期待できます。一番爆発力を秘めている性能が高いJPCです。
わずかにルビーに届きませんが、かなり高い期待値です。
JPの平均: 2235.23枚
はずれ時の平均: 211.33枚
サファイアやトパーズと同じくはずれた時の配当が渋く200枚台ですが、JPが獲れた時の期待値は2200枚越えとサファイアの2倍以上で一番高いです。JP獲得率が一番低いことを考えると、エメラルドJPの獲得率が上振れればかなりのプラスになるはずです。
アメジストJPC
概要
執筆時ではまだ未実装(カラコ6のロケテ段階)ですが、判明しているルールでシミュレーションしてみました(ルールに変更があれば修正します)。アニマロッタのムーンライトのように、ラウンド制となっています。外周にあるSPポケット(内周は確定)に入賞したボールは次のラウンドに進出、というルールです。最終ラウンドまで進んだボールはサファイアのように内周の$${1\over6}$$を決めればJP、またトパーズのように入った分だけJPに倍率がつきます。アメジストは1倍→3倍→5倍と2倍づつ増えていきます。
確率と期待値
サファイアの次に当選率が高いJPCとなっています。続けて期待値も見てみます。
アメジストJPCはサファイアJPCと同じなのでそのまま比較できます。期待値はサファイアより若干多い程度です。
JP時の平均: 1150.78枚
はずれ時の平均: 241.21枚
かなりサファイアに似ているJPCです。意外とJP獲得時の上振れが少ない上、サファイアよりもJP獲得率が約7%も低いので、アメジストが選択されるくらいならサファイアの方が良いでしょう。一方でルビー・トパーズ・エメラルドに比べるとかなりマイルドなJPCとなっており、情勢としてはサファイア・アメジストの安定組対ルビー・トパーズ・エメラルドの波乱組といったところでしょう。
コンプリートJPC
概要
JPを全種獲得した後に挑戦できるJPCで、JP獲得時のボーナスとしてJP全種の獲得枚数がボーナスとして加算されます。80球以内に外周と内周を全て埋めることで獲得となります。
確率
コンプリート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
この記事が気に入ったらサポートをしてみませんか?