6号機ジャグラーのぶどう確率予測
導入日が延期されていた6号機ジャグラーですが、導入日は12月14日になったというニュースが流れていますね。
最も気になるのはスペックだと思いますが、こちらは㈱北電子さんのホームページ上で公開されており、以下のような数値になっています。
㈱北電子さんのホームページ(https://www.kitadenshi.co.jp/slot/)から引用
次に気になるのは設定差の部分かと思いますが、ジャグラーシリーズといえばメイン小役のぶどう確率に設定差が設けられていることが有名です。
残念ながら、小役確率はまだ公表されていませんが、ユーザーとしてはぜひとも知りたい情報ですよね。
ということで、今回は6号機ジャグラーのぶどう確率を推測してみたいと思います。
スペックから逆算する方法が王道かと思いますが、シミュレーションを使って泥臭く求めてみます。
作成するプログラムは↓のようなイメージです。
ぶどう確率を6.00~7.00まで変化させたときの出玉率を計算した後、近似式を利用して出玉率が設計値になるぶどう確率を算出します。
※公表されている出玉率の算出方法が不明であったり、ぶどう以外の小役確率は適当な推測値を入力していますので、今回の結果が正しいものとは限りません。
近似式とは
近似式は、ばらつきをもったデータの傾向を知るのに有効な手法です。
ご存じのようにスロットの出玉率は膨大な試行を行わないと設計値に収束しません。
そのため、今回取得したデータも下図のようにばらつきを持った結果となります。
ぶどう確率の推測精度をあげるためには、ばらつきを持ったデータをそのまま信用するのではなく、ぶどう確率と出玉率の傾向をつかむ必要があるため、近似式を利用します。
今回はぶどう確率を振る範囲が狭く、データの傾向もほぼ線形で近似できると思うので、一次近似式を利用したいと思います。
本日のアジェンダはこちら。
1. ぶどう確率を変化させた時の出玉率をシミュレーション
では早速、ぶどう確率を変化させた時の出玉率をシミュレーションを行います。
とは言っても、以前作成した「マイジャグラーⅢのシミュレータ」と基礎は同じです。
まずは設定ごとの各種数値の設定から。
ぶどう確率はあとから設定するので、ここでは定義していません。
また、設定値は人力で指定する方法にしています。
# 設定を指定 設定 = 1 # 設定ごとの小役・ボーナス確率の設定 header = ['Machine', 'Setting', 'Replay', 'Cherry', 'BB', 'RB', 'Bell', 'Pierrot', 'out'] set1 = ['ImJug6', '1', '7.30', '33.57', '273.1', '439.8', '1092', '1092', '97.0'] set2 = ['ImJug6', '2', '7.30', '33.57', '269.7', '399.6', '1092', '1092', '98.0'] set3 = ['ImJug6', '3', '7.30', '33.37', '269.7', '331.0', '1092', '1092', '99.5'] set4 = ['ImJug6', '4', '7.30', '33.23', '259.0', '315.1', '1092', '1092', '101.1'] set5 = ['ImJug6', '5', '7.30', '33.03', '259.0', '255.0', '1092', '1092', '103.3'] set6 = ['ImJug6', '6', '7.30', '33.03', '255.0', '255.0', '1092', '1092', '105.5'] SetData = [header, set1, set2, set3, set4, set5, set6]
次に、小役やボーナス確率を設定していきます。
設定ごとの小役・ボーナス確率は、「SetData」という配列に格納したので、それぞれ該当箇所を参照して設定値を取得していきます。
小役・ボーナス確率から、0~65535の範囲に入るように各小役の乱数範囲を設定すれば完了です。
# 各役の設定値の取得 リプレイ = float(SetData[設定][2]) チェリー = float(SetData[設定][3]) BB = float(SetData[設定][4]) RB = float(SetData[設定][5]) ベル = float(SetData[設定][6]) ピエロ = float(SetData[設定][7]) # 乱数範囲の設定 リプレイ範囲 = round(65536 / リプレイ) チェリー範囲 = round(65536 / チェリー) BB範囲 = round(65536 / BB) RB範囲 = round(65536 / RB) ベル範囲 = round(65536 / ベル) ピエロ範囲 = round(65536 / ピエロ) リプレイ範囲_下 = 0 リプレイ範囲_上 = リプレイ範囲_下 + リプレイ範囲 - 1 チェリー範囲_下 = リプレイ範囲_上 + 1 チェリー範囲_上 = チェリー範囲_下 + チェリー範囲 - 1 BB範囲_下 = チェリー範囲_上 + 1 BB範囲_上 = BB範囲_下 + BB範囲 - 1 RB範囲_下 = BB範囲_上 + 1 RB範囲_上 = RB範囲_下 + RB範囲 - 1 ベル範囲_下 = RB範囲_上 + 1 ベル範囲_上 = ベル範囲_下 + ベル範囲 - 1 ピエロ範囲_下 = ベル範囲_上 + 1 ピエロ範囲_上 = ピエロ範囲_下 + ピエロ範囲 - 1
次に、ぶどう確率を変更しながら、ループ処理を行う部分を作成します。
今回、ぶどう確率を6.00~7.00まで0.01刻みで変更したいと考えていますが、Pythonのfor文では整数刻みしか設定することができません。
そこで、while文を用いてぶどう確率を変更していきます。
ループする処理だけを記載したコードは下記のようになります。
ぶどう確率が7.00以上になるまで、ぶどう確率を6.00から0.01ずつ増加させていくことで、やりたかった小数刻みのループ処理を行うことができます。
# 初期のぶどうの値 ぶどう = 6.00 # ループ処理(ぶどう確率を変えながらループ処理を行う。) while ぶどう <= 7.00: # ぶどう確率を変更 ぶどう = round(ぶどう + 0.01, 2)
↑のwhile文内に、必要な処理を記載したものが下記のコードです。
ぶどう確率を変更するたびに、ぶどうの乱数範囲を設定しなおした上で、1回転ごとの差枚数を計算していきます。
また、結果を保存するための配列を事前に定義しています。
今回は100万回転回したときの出玉率を元にぶどう確率を推測していきます。
# 結果入力する配列を準備 result_ぶどう = [] result_出玉率 = [] # 初期のぶどうの値 ぶどう = 6.00 # ループ処理(ぶどう確率を変えながらループ処理を行う。) while ぶどう <= 7.00: # ぶどうの乱数範囲の設定 ぶどう範囲 = round(65536 / ぶどう) ぶどう範囲_下 = ピエロ範囲_上 + 1 ぶどう範囲_上 = ぶどう範囲_下 + ぶどう範囲 - 1 # 差枚数を入力する変数 Total = 0 # 試行回数の設定 loop = 1000000 # loopで設定した回転数分まわす for j in range(loop): # 1回転あたり3枚必要なので、3枚マイナス Total = Total - 3 # 1回転ごとに乱数を生成(0~65535の範囲) rand = random.randint(0,65535) # 小役orボーナスの当選確認と差枚数の加算 if リプレイ範囲_下 <= rand <= リプレイ範囲_上: Total = Total + 3 elif チェリー範囲_下 <= rand <= チェリー範囲_上: Total = Total + 1 elif BB範囲_下 <= rand <= BB範囲_上: Total = Total + 252 elif RB範囲_下 <= rand <= RB範囲_上: Total = Total + 96 elif ベル範囲_下 <= rand <= ベル範囲_上: Total = Total + 14 elif ピエロ範囲_下 <= rand <= ピエロ範囲_上: Total = Total + 10 elif ぶどう範囲_下 <= rand <= ぶどう範囲_上: Total = Total + 8 else: # はずれだったら何もしない Total = Total # 出玉率の計算 出玉率 = 100 + round(Total / loop / 3 * 100, 2) # 結果を配列に入力 result_ぶどう.append(ぶどう) result_出玉率.append(出玉率) # ぶどう確率を変更 ぶどう = round(ぶどう + 0.01, 2)
2. 一次近似式を求める
↑の結果から、一次近似式を求めていきます。
Pythonでは、下記のコードで一次近似式を求めることができます。
一次近似式 = np.polyfit(xの配列, yの配列, 1)
今回は、xの配列にぶどう確率、yの配列に出玉率を指定して一次近似式を求めます。
# 一次近似式を算出 result_ぶどう = np.array(result_ぶどう) result_出玉率 = np.array(result_出玉率) result_fitting = np.polyfit(result_ぶどう, result_出玉率, 1)
3. 出玉率が設計値になるぶどう確率を算出
先ほど求めた一次近似式から、出玉率が設計値になるぶどう確率を算出していきます。
一次近似式は、「Y = ax + b」なので、「x = 」の式に直せばOKです。
今回は、下記のコードで出玉率が設計値となるぶどう確率を算出できます。
# 出玉率が設計値になるぶどう確率を求める ぶどう推測値 = (float(SetData[設定][8]) - result_fitting[1]) / result_fitting[0] # 結果の出力 print("設定値:", 設定, ", ぶどう推測値", ぶどう推測値)
4. 今回作成したコード
今回作成したコードは、こちら。
結果を視覚的にも確認できるように、グラフを描画するコードを最後に入れています。
# coding: UTF-8 import random import numpy as np from matplotlib import pyplot as plt # 設定を指定 設定 = 1 # 設定ごとの小役・ボーナス確率の設定 header = ['Machine', 'Setting', 'Replay', 'Cherry', 'BB', 'RB', 'Bell', 'Pierrot', 'out'] set1 = ['ImJug6', '1', '7.30', '33.57', '273.1', '439.8', '1092', '1092', '97.0'] set2 = ['ImJug6', '2', '7.30', '33.57', '269.7', '399.6', '1092', '1092', '98.0'] set3 = ['ImJug6', '3', '7.30', '33.37', '269.7', '331.0', '1092', '1092', '99.5'] set4 = ['ImJug6', '4', '7.30', '33.23', '259.0', '315.1', '1092', '1092', '101.1'] set5 = ['ImJug6', '5', '7.30', '33.03', '259.0', '255.0', '1092', '1092', '103.3'] set6 = ['ImJug6', '6', '7.30', '33.03', '255.0', '255.0', '1092', '1092', '105.5'] SetData = [header, set1, set2, set3, set4, set5, set6] # 各役の設定値の取得 リプレイ = float(SetData[設定][2]) チェリー = float(SetData[設定][3]) BB = float(SetData[設定][4]) RB = float(SetData[設定][5]) ベル = float(SetData[設定][6]) ピエロ = float(SetData[設定][7]) # 乱数範囲の設定 リプレイ範囲 = round(65536 / リプレイ) チェリー範囲 = round(65536 / チェリー) BB範囲 = round(65536 / BB) RB範囲 = round(65536 / RB) ベル範囲 = round(65536 / ベル) ピエロ範囲 = round(65536 / ピエロ) リプレイ範囲_下 = 0 リプレイ範囲_上 = リプレイ範囲_下 + リプレイ範囲 - 1 チェリー範囲_下 = リプレイ範囲_上 + 1 チェリー範囲_上 = チェリー範囲_下 + チェリー範囲 - 1 BB範囲_下 = チェリー範囲_上 + 1 BB範囲_上 = BB範囲_下 + BB範囲 - 1 RB範囲_下 = BB範囲_上 + 1 RB範囲_上 = RB範囲_下 + RB範囲 - 1 ベル範囲_下 = RB範囲_上 + 1 ベル範囲_上 = ベル範囲_下 + ベル範囲 - 1 ピエロ範囲_下 = ベル範囲_上 + 1 ピエロ範囲_上 = ピエロ範囲_下 + ピエロ範囲 - 1 # 結果入力する配列を準備 result_ぶどう = [] result_出玉率 = [] # 初期のぶどうの値 ぶどう = 6.00 # ループ処理(ぶどう確率を変えながらループ処理を行う。) while ぶどう <= 7.00: # ぶどうの乱数範囲の設定 ぶどう範囲 = round(65536 / ぶどう) ぶどう範囲_下 = ピエロ範囲_上 + 1 ぶどう範囲_上 = ぶどう範囲_下 + ぶどう範囲 - 1 # 差枚数を入力する変数 Total = 0 # 試行回数の設定 loop = 1000000 # loopで設定した回転数分まわす for j in range(loop): # 1回転あたり3枚必要なので、3枚マイナス Total = Total - 3 # 1回転ごとに乱数を生成(0~65535の範囲) rand = random.randint(0,65535) # 小役orボーナスの当選確認と差枚数の加算 if リプレイ範囲_下 <= rand <= リプレイ範囲_上: Total = Total + 3 elif チェリー範囲_下 <= rand <= チェリー範囲_上: Total = Total + 1 elif BB範囲_下 <= rand <= BB範囲_上: Total = Total + 252 elif RB範囲_下 <= rand <= RB範囲_上: Total = Total + 96 elif ベル範囲_下 <= rand <= ベル範囲_上: Total = Total + 14 elif ピエロ範囲_下 <= rand <= ピエロ範囲_上: Total = Total + 10 elif ぶどう範囲_下 <= rand <= ぶどう範囲_上: Total = Total + 8 else: # はずれだったら何もしない Total = Total # 出玉率の計算 出玉率 = 100 + round(Total / loop / 3 * 100, 2) # 結果を配列に入力 result_ぶどう.append(ぶどう) result_出玉率.append(出玉率) # ぶどう確率を変更 ぶどう = round(ぶどう + 0.01, 2) # 一次近似式を算出 result_ぶどう = np.array(result_ぶどう) result_出玉率 = np.array(result_出玉率) result_fitting = np.polyfit(result_ぶどう, result_出玉率, 1) # 出玉率が設計値になるぶどう確率を求める ぶどう推測値 = (float(SetData[設定][8]) - result_fitting[1]) / result_fitting[0] # 結果の出力 print("設定値:", 設定, ", ぶどう推測値", ぶどう推測値) # グラフ用に各ぶどう確率での出玉率を求める fitting = np.poly1d(result_fitting)(result_ぶどう) # グラフ表示 plt.scatter(result_ぶどう, result_出玉率, label='raw', color='#377eb8') plt.plot(result_ぶどう, fitting, label='fitting', color='#ff7f00') plt.scatter(ぶどう推測値, float(SetData[設定][8]), label='result', color='#e41a1c') plt.legend() plt.show()
5. 結果の確認
結果は以下のようになりました。
設定値: 1 , ぶどう推測値 6.099327073034374 設定値: 2 , ぶどう推測値 6.11838948029937 設定値: 3 , ぶどう推測値 6.173569038229482 設定値: 4 , ぶどう推測値 6.15442308596137 設定値: 5 , ぶどう推測値 6.232909940330271 設定値: 6 , ぶどう推測値 5.955453889413322
ぶどう確率vs出玉率のグラフはこんな感じ。
ちょっと今までのジャグラーでは考えられない結果になってしまいましたね。
近似式の問題かと思い、二次近似式でもやってみましたが、結果はたいして変わらずでした。
出玉率の計算が特殊なのか、暫定で入れたチェリー確率が異なるのか、はたまたこの結果が正しいのか。
かなり自信がないですが、ホール導入後の結果を楽しみに待ちたいと思います。
にほんブログ村
コメント
コメントを投稿