P大工の源さん 超韋駄天のシミュレーション(プログラミング編)
前回の計算式を元に、Pythonで「P大工の源さん 超韋駄天」のスランプグラフを作成してみましょう。
使うライブラリのインポート
今回は、以下の2つのライブラリを使用するので、事前にインポートしておきます。
乱数生成用に「ramdom」、スランプグラフ描画用に「matplotlib.pyplot」を使用します。
# coding: UTF-8 import random import matplotlib.pyplot as plt
大当たり乱数の設定
次に通常時の大当たりの範囲を設定します。
パチンコでは一般的に0~65535の数値の中から、特定の数値を引いたときに大当たりとなるように構成されているため、今回もそれにならって大当たりの範囲を設定していきます。
def SlumpGraph_calc(loop, Border):
# 大当たり確率の設定
通常時6R確変 = 318.13 / 0.602
通常時6R通常 = 318.13 / 0.398
時短時9RBonus = 2.06 / 0.20
時短時3RBonus = 2.06 / 0.80
# 乱数範囲の設定準備
通常時6R確変範囲 = round(65536 / 通常時6R確変)
通常時6R通常範囲 = round(65536 / 通常時6R通常)
時短時9RBonus範囲 = round(65536 / 時短時9RBonus)
時短時3RBonus範囲 = round(65536 / 時短時3RBonus)
# 乱数範囲の設定(通常時)
通常時6R確変範囲_下 = 0
通常時6R確変範囲_上 = 通常時6R確変範囲_下 + 通常時6R確変範囲 - 1
通常時6R通常範囲_下 = 通常時6R確変範囲_上 + 1
通常時6R通常範囲_上 = 通常時6R通常範囲_下 + 通常時6R通常範囲 - 1
# 乱数範囲の設定(時短時)
時短時9RBonus範囲_下 = 0
時短時9RBonus範囲_上 = 時短時9RBonus範囲_下 + 時短時9RBonus範囲 - 1
時短時3RBonus範囲_下 = 時短時9RBonus範囲_上 + 1
時短時3RBonus範囲_上 = 時短時3RBonus範囲_下 + 時短時3RBonus範囲 - 1
試しに、ここで設定した数値を確認してみましょう。
通常時6R確変: 1 ~ 124 = 1 / 528.516129032258 通常時6R通常: 125 ~ 206 = 1 / 799.219512195122 時短時9RBonus: 1 ~ 6363 = 1 / 10.2995442401383 時短時3RBonus: 6364 ~ 31814 = 1 / 2.574987230364229
若干誤差はありますが、ほぼ数値通りに設定できています。
1回転ごとの差玉計算(通常時)
ここから1回転ごとの差玉数を計算していきます。
ちょっと長いので、ポイント部分だけ抜粋して説明したあとで、コード全体を記載します。
まずは、基本の部分として、1回転ごとに「1. 乱数の取得」→「2. 当たり判定」→「3. 出玉加算」の順に行います。
# 結果用の変数と箱の準備
Total = 0
Result = []
# ループ処理
for i in range(loop):
# Borderは250玉で回る回転数
# 1回転に250 / Borderの玉数が必要
Total = Total - (250 / Border)
# 1回転ごとに乱数を生成(0~65535の範囲)
rand = random.randint(0,65535)
# もし6R確変大当たりなら
if 通常時6R確変範囲_下 <= rand <= 通常時6R確変範囲_上:
# 6R通常大当たり分の出玉を加算して、結果用の箱に追加
Total = Total + 660 - 10 * 6
Result.append(Total)
# もし6R通常大当たりなら
elif 通常時6R通常範囲_下 <= rand <= 通常時6R通常範囲_上:
# 6RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 660 - 10 * 6
Result.append(Total)
# もしはずれなら
else:
# 通常時1回転消化時の差玉を結果表示用の箱に追加
Result.append(Total)
1回転ごとの差玉計算(時短中)
時短時は↑とは別なループ処理が必要になります。
ここでは、4回(時短3回+残保1個)連続ではずれとなるまでループする処理を行います。
乱数の取得と当たり判定は↑と同じですが、大当たり時に時短回数を4回に戻すための処理と、はずれの場合に時短回数を減らすための処理が必要です。
# 結果用の変数と箱の準備
# 時短中のループ
j = 0
while j < 4:
# 1回転ごとに乱数を生成(0~65535の範囲)
rand2 = random.randint(0,65535)
# もし9RBonusなら
if 時短時9RBonus範囲_下 <= rand2 <= 時短時9RBonus範囲_上:
# 9RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 990 - 10 * 9
# 大当たり後に再度時短に入るので、時短回数をリセット
j = 0
# もし3RBonusなら
elif 時短時3RBonus範囲_下 <= rand2 <= 時短時3RBonus範囲_上:
# 3RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 330 - 10 * 3
# 大当たり後に再度時短に入るので、時短回数をリセット
j = 0
# もしはずれなら
else:
# 時短回数を1回増やす
j = j + 1
# 時短1回転消化時の差玉を結果表示用の箱に追加
Result.append(Total)
1回転ごとの差玉計算(まとめたコード)
↑2つの処理を合体したものが、こちらのコードです。
これで1回転毎の差玉数を算出できます。
# 結果用の変数と箱の準備
Total = 0
Result = []
# ループ処理
for i in range(loop):
# Borderは250玉で回る回転数
# 1回転に250 / Borderの玉数が必要
Total = Total - (250 / Border)
# 1回転ごとに乱数を生成(0~65535の範囲)
rand = random.randint(0,65535)
# もし6R確変大当たりなら
if 通常時6R確変範囲_下 <= rand <= 通常時6R確変範囲_上:
# 6R通常大当たり分の出玉を加算して、結果用の箱に追加
Total = Total + 660 - 10 * 6
Result.append(Total)
# 時短中のループ
j = 0
while j < 4:
# 1回転ごとに乱数を生成(0~65535の範囲)
rand2 = random.randint(0,65535)
# もし9RBonusなら
if 時短時9RBonus範囲_下 <= rand2 <= 時短時9RBonus範囲_上:
# 9RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 990 - 10 * 9
# 大当たり後に再度時短に入るので、時短回数をリセット
j = 0
# もし3RBonusなら
elif 時短時3RBonus範囲_下 <= rand2 <= 時短時3RBonus範囲_上:
# 3RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 330 - 10 * 3
# 大当たり後に再度時短に入るので、時短回数をリセット
j = 0
# もしはずれなら
else:
# 時短回数を1回増やす
j = j + 1
# 時短1回転消化時の差玉を結果表示用の箱に追加
Result.append(Total)
# もし6R通常大当たりなら
elif 通常時6R通常範囲_下 <= rand <= 通常時6R通常範囲_上:
# 6RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 660 - 10 * 6
Result.append(Total)
# もしはずれなら
else:
# 通常時1回転消化時の差玉を結果表示用の箱に追加
Result.append(Total)
今回作成したコード
最後に今回のコード全体を記載します。結果をグラフで表示するための処理とシミュレーション条件を指定する部分を追加しています。
# coding: UTF-8
import random
import matplotlib.pyplot as plt
def SlumpGraph_calc(loop, Border):
# 大当たり確率の設定
通常時6R確変 = 318.13 / 0.602
通常時6R通常 = 318.13 / 0.398
時短時9RBonus = 2.06 / 0.20
時短時3RBonus = 2.06 / 0.80
# 乱数範囲の設定準備
通常時6R確変範囲 = round(65536 / 通常時6R確変)
通常時6R通常範囲 = round(65536 / 通常時6R通常)
時短時9RBonus範囲 = round(65536 / 時短時9RBonus)
時短時3RBonus範囲 = round(65536 / 時短時3RBonus)
# 乱数範囲の設定(通常時)
通常時6R確変範囲_下 = 0
通常時6R確変範囲_上 = 通常時6R確変範囲_下 + 通常時6R確変範囲 - 1
通常時6R通常範囲_下 = 通常時6R確変範囲_上 + 1
通常時6R通常範囲_上 = 通常時6R通常範囲_下 + 通常時6R通常範囲 - 1
# 乱数範囲の設定(時短時)
時短時9RBonus範囲_下 = 0
時短時9RBonus範囲_上 = 時短時9RBonus範囲_下 + 時短時9RBonus範囲 - 1
時短時3RBonus範囲_下 = 時短時9RBonus範囲_上 + 1
時短時3RBonus範囲_上 = 時短時3RBonus範囲_下 + 時短時3RBonus範囲 - 1
# 結果用の変数と箱の準備
Total = 0
Result = []
# ループ処理
for i in range(loop):
# Borderは250玉で回る回転数
# 1回転に250 / Borderの玉数が必要
Total = Total - (250 / Border)
# 1回転ごとに乱数を生成(0~65535の範囲)
rand = random.randint(0,65535)
# もし6R確変大当たりなら
if 通常時6R確変範囲_下 <= rand <= 通常時6R確変範囲_上:
# 6R通常大当たり分の出玉を加算して、結果用の箱に追加
Total = Total + 660 - 10 * 6
Result.append(Total)
# 時短中のループ
j = 0
while j < 4:
# 1回転ごとに乱数を生成(0~65535の範囲)
rand2 = random.randint(0,65535)
# もし9RBonusなら
if 時短時9RBonus範囲_下 <= rand2 <= 時短時9RBonus範囲_上:
# 9RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 990 - 10 * 9
# 大当たり後に再度時短に入るので、時短回数をリセット
j = 0
# もし3RBonusなら
elif 時短時3RBonus範囲_下 <= rand2 <= 時短時3RBonus範囲_上:
# 3RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 330 - 10 * 3
# 大当たり後に再度時短に入るので、時短回数をリセット
j = 0
# もしはずれなら
else:
# 時短回数を1回増やす
j = j + 1
# 時短1回転消化時の差玉を結果表示用の箱に追加
Result.append(Total)
# もし6R通常大当たりなら
elif 通常時6R通常範囲_下 <= rand <= 通常時6R通常範囲_上:
# 6RBonus分の出玉を加算して、結果用の箱に追加
Total = Total + 660 - 10 * 6
Result.append(Total)
# もしはずれなら
else:
# 通常時1回転消化時の差玉を結果表示用の箱に追加
Result.append(Total)
# 結果の表示
plt.plot(Result)
plt.show()
if __name__ == "__main__":
# 試行回数
loop = 100000000
# 1kあたりの回転数
Border = 20
SlumpGraph_calc(loop, Border)
シミュレーション結果の確認
最後にシミュレーションの結果を確認してみます。
まずは、250玉あたり20回転のグラフがこちら。
続いて、250玉あたり21回転のグラフがこちら。
ボーダーはおよそ20回転超とされていますが、今回のグラフからも20回転と21回転の間にプラスマイナス0の分岐点がありそうなことが推測できます。
にほんブログ村
コメント
コメントを投稿