P大工の源さん 超韋駄天 LIGHTのボーダー算出
お世話になっております、スログラミングです。
相変わらず韋駄天ばっかり打ってます。
たぶん人生で一番打ったパチンコ1位ですね。
で、打つからには当然勝ちたいわけですが、韋駄天ライトのボーダー情報が結構バラバラで困ってます。
そう!そんな時はPythonの出番ですね!
では早速Pythonでコーディングしていきましょう。
今回のアジェンダはこちら。
1. 算出方法
2. ボーダー算出部分のコード
3. 今回作成したコード
4. 結果の確認
にほんブログ村
2. ボーダー算出部分のコード
3. 今回作成したコード
4. 結果の確認
1. 算出方法
今回は以下のフローでボーダーを算出していきます。
1.1k当りの回転数を変えながら出率を算出
2.1k当りの回転数と出率の傾向を近似
3.近似結果からボーダー(出率が100%になるところ)を算出
出率のシミュレーションは以前作成した319ver.の数値を129ver.に変えればOKですね。
また、近似と聞いて、こちらの過去記事を思い浮かべてくださった方。
正解です!やることは同じです。
要は、「シミュレーションの結果にばらつきがあるので、ばらつきを除いてシミュレーション結果の傾向だけを抽出しよう!」ということですね。
絵付きで説明してるので、ぜひ過去記事もご覧ください。
また、今回の評価条件は以下の形としています。
1.1k当りの回転数は10~30回転まで振る
2.出玉は通常時1000万回転後の結果を使用
3.右打ちの玉減りは無視
2. ボーダー算出部分のコード
ここから実際のコーディングを行っていきます。
出率の計算
フローチャートのループ処理の部分はいつもとほぼ同じなので割愛しますが、出率の計算方法に関しては説明しておきます。
スロットの情報サイトを見ていると出率(機械割)といった数値が記載してあるのでスロッターの皆様には馴染み深いかもしれません。
出率(機械割)とはなんぞやというと、出玉と入れた玉の比率です。
100玉入れて100玉出る台が出率100%、110玉出る台が機械割110%ですね。
入れた玉数は、1k(250玉)当りの回転数から算出できます。
ループ処理の流れもざっくり含んだ形で記載したプログラムはこちら。
最後の行が出率の計算式です。
1k(250玉)を1kあたりの回転数で割ることで、1回転に必要な玉数がわかります。
それに回転数を掛け算することで入れた玉数を算出可能です。
※今回の注意点として、出率を計算するために、ループ処理では差玉でなく出玉をシミュレートする必要があります。
# 試行回数 loop = 1000000 # 1kあたりの回転数の初期値 回転数 = 10 # 出玉を入れる箱を0にする Total = 0 # 1k当りの回転数を30まで変更しながらシミュレーション while 回転数 <= 30: #ループ処理 for i in range(loop): ・・・ ・・・ # 1k当りの回転数ごとの出率を格納 出率リスト.append(Total / ((250 / 回転数) * loop) * 100)
データの確認
まずは、何次の近似式を使用するかを確認する必要があります。
試しに、1k当りの回転数vs出率の結果をグラフ化したものがこちら。
グラフを見る限り、一次近似式を使用すれば良さそうですね。
近似式の作成
取得したデータを一次近似します。
一次近似式の作成は以下の一文でOKです。
最後の数字の部分が何次で近似するかの部分ですね。
# 1k当りの回転数vs出率数を一次近似 近似 = np.polyfit(回転数リスト, 出率リスト, 1)
回転数リストと出率リストにはこんな感じでデータが入っています。
ボーダーを算出
最後にボーダーを算出すれば完成ですが、ようは出率が100%になる回転数の値を求めればOKですね。
計算方法は以下の通りです。
出率の計算方法をコードで記載したものがこちら。
np.polyfitは配列形式で近似式の各項の係数をもっています。
今回の例では、以下の参照方法で必要な係数を取得できます。
一次の係数の値(:a) = 近似[1]
切片の値(:b) = 近似[0]
# 一次方程式から出率が100になる回転数を算出 border = (100 - 近似[1]) / 近似[0]
3. 今回作成したコード
最終的には以下のようなコードを作成しました。
いつものようにグラフを描く部分を追加しています。
# coding: UTF-8 # 乱数作成用 import random # ボーダー算出用 import numpy as np # スランプグラフ描画用 import pylab # 試行回数 loop = 10000000 # 1kあたりの回転数の初期値 回転数 = 10 # 1k当りの回転数vs出率のデータ作成---ここから---- # 結果用の箱の準備 回転数リスト = [] 出率リスト = [] # 1k当りの回転数を30まで変更しながらシミュレーション while 回転数 <= 30: # 大当たり確率の設定 通常時9R時短 = 65536 / 1.000 通常時3R時短 = 129.77 / 0.50 通常時3R通常 = 129.77 / 0.50 時短時9RBonus = 2.15 / 0.10 時短時3RBonus = 2.15 / 0.90 # 乱数範囲の設定準備 通常時9R時短範囲 = round(65536 / 通常時9R時短) 通常時3R時短範囲 = round(65536 / 通常時3R時短) 通常時3R通常範囲 = round(65536 / 通常時3R通常) 時短時9RBonus範囲 = round(65536 / 時短時9RBonus) 時短時3RBonus範囲 = round(65536 / 時短時3RBonus) # 乱数範囲の設定(通常時) 通常時9R時短範囲_下 = 1 通常時9R時短範囲_上 = 通常時9R時短範囲_下 + 通常時9R時短範囲 - 1 通常時3R時短範囲_下 = 通常時9R時短範囲_上 + 1 通常時3R時短範囲_上 = 通常時3R時短範囲_下 + 通常時3R時短範囲 - 1 通常時3R通常範囲_下 = 通常時3R時短範囲_上 + 1 通常時3R通常範囲_上 = 通常時3R通常範囲_下 + 通常時3R通常範囲 - 1 # 乱数範囲の設定(時短時) 時短時9RBonus範囲_下 = 1 時短時9RBonus範囲_上 = 時短時9RBonus範囲_下 + 時短時9RBonus範囲 - 1 時短時3RBonus範囲_下 = 時短時9RBonus範囲_上 + 1 時短時3RBonus範囲_上 = 時短時3RBonus範囲_下 + 時短時3RBonus範囲 - 1 # 出玉を入れる箱を0にする Total = 0 #ループ処理 for i in range(loop): # 乱数の取得 rand = random.randint(1,65536) # 当否判定処理 # 時短付きの当りの場合 if 通常時9R時短範囲_下 <= rand <= 通常時3R時短範囲_上: # 9Rなら9R分の出玉を追加 if 通常時9R時短範囲_下 <= rand <= 通常時9R時短範囲_上: Total = Total + 720 - 10 * 9 # 3Rなら3R分の出玉を追加 elif 通常時3R時短範囲_下 <= rand <= 通常時3R時短範囲_上: Total = Total + 240 - 10 * 3 # RUSHに突入させる j = 0 # 連続外れ回数 # 4連続でハズレるまで計測 while j < 4: rand2 = random.randint(1,65536) # count2 = count2 + 1 # 9Rなら9R分の出玉を追加 if 時短時9RBonus範囲_下 <= rand2 <= 時短時9RBonus範囲_上: Total = Total + 720 - 10 * 9 j = 0 # 3Rなら3R分の出玉を追加 elif 時短時3RBonus範囲_下 <= rand2 <= 時短時3RBonus範囲_上: Total = Total + 240 - 10 * 3 j = 0 # ハズレなら連続ハズレ回数を1増やす else: j = j + 1 # 通常当りの場合 elif 通常時3R通常範囲_下 <= rand <= 通常時3R通常範囲_上: Total = Total + 240 - 10 * 3 # 1k当りの回転数ごとの出率を格納 回転数リスト.append(回転数) 出率リスト.append(Total / ((250 / 回転数) * loop) * 100) # 1k当りの回転数を増やす 回転数 = 回転数 + 1 # 1k当りの回転数vs出率のデータ作成---ここまで---- # ボーダー算出---ここから---- # 1k当りの回転数vs出率数を一次近似 近似 = np.polyfit(回転数リスト, 出率リスト, 1) # 一次方程式から出率が100になる回転数を算出 border = (100 - 近似[1]) / 近似[0] # グラフの描画 pylab.scatter(回転数リスト, 出率リスト, label="シミュ値") # 生データ 近似線 = np.poly1d(近似)(回転数リスト) # 近似式から近似線を計算 pylab.plot(回転数リスト, 近似線, label="近似線") # 一次近似したデータ pylab.scatter(border, 100, label="ボーダー:" + str(round(border, 1)) + "[回/k]") # ボーダー値 pylab.title("韋駄天ライトボーダー" + "\n" + "(ラッシュ中の玉減り無)", fontname="MS Gothic") pylab.xlabel("回転数[回/1k]", fontname="MS Gothic") pylab.ylabel("出率[%]", fontname="MS Gothic") pylab.legend(prop={"family":"MS Gothic"}) pylab.grid() pylab.show() # ボーダー算出---ここまで----
4. 結果の確認
作成したコードを実行した結果はこちら。
ボーダーは19.9[回/k]となりました。
近似も良い感じですし、感覚的にボーダー20くらいかなと思っていたので、結果に問題なさそうですね。
また、せっかくなので韋駄天ミドルのボーダーも算出してみました。
こちらは、ボーダーが20.1[回/k]となりました。
数値上はわずかに韋駄天ライトの方が甘いんですね。
今回作成したコードのRUSH部分さえいじれば色々な機種のボーダーを算出できそうなので、今後も気になる機種があったら計算してみます。
にほんブログ村
コメント
コメントを投稿