🎰

パチンコのミドル機をどのぐらい回せばいいのかRustで計算してみる~必勝法を添えて~

2022/12/25に公開

はじめに

こんにちは〜、本記事は no plan inc. Advent Calendar 2022 の25日目の記事です。

最後の記事こんなのでいいのかと思いつつ、書いていきたいと思います。よろしくお願いいたします。

パチンコとは?

パチンコは日本でなぜか許されている合法ギャンブルです。

11月にシンガポールのカジノで遊んだのですが、そういえば日本の合法ギャンブルとは無縁だったなと思い、下火とはいえ15兆円もの巨大な産業であるパチンコの秘密を探りたいと思い数回身銭を切って調査しました。

パチンコ市場規模

これはあくまで起業家としての公正な調査であり、個人的にギャンブルにハマってしまった記録を残しているわけではありません。そこは強調しておきます()

ゲーム性として、「ヘソ」と呼ばれているパチンコ台の中心にある穴にパチンコ玉を入れます。そこに入ると1回抽選が行われ、スロットが回ります。そのスロットの数字がゾロ目になると大当たりになっていっぱい球が出ます。(嬉しい)

台によってカテゴリがあって、ミドル(大体1/319.6)、ライトミドル(大体1/200)、甘デジ(大体1/100)とあり、ミドルが最も当たりにくい代わりによく出ます。甘デジは当たりやすいですが、玉はあまり出ません。

大体の機種で当たると数十%の確率で確率変動した状態(ミドルだと1/319.6 => 1/99ぐらいで)で抽選を受けることができるようになります。確変で抽選をすることによって、連チャン(複数回当たること)を狙うわけです。

ボーダー理論とは?

どうやらパチンコで勝っているパチプロという方がいるということがわかりました。

ということは、完全な運ゲーではなく実力で介入できる余地があるように思います。そこで色々と調べていると、ボーダー理論という概念を目にしました。

この理論が正しいか自体はDYOR必須ですが、多くのパチプロが言っていたので大体合っている気がします。

どういう理論かというと、1000円を投資したときに何回抽選でき、それがどれだけ上振れたり下振れたりしているかということです。

当たり前ですが、同じ投資金額で他の条件が全て同じであるならば、抽選回数が多いに越したことはありません

そこに着目して、1000円でどのぐらい抽選を引ければ期待値がプラスになるか、マイナスになるかを計算するわけです。

期待値がプラスの台を打ち続ける事によって、長期的には必ずプラスになります。 もちろん確率なので、1日単位では負けることはあります。ただし1年通して通い続けて試行回数を増やし、確率を収束させにいくとプラスになるということです。

理論的には単純ですが、実際にボーダーがプラスの台にありつけることは稀です。なぜならパチンコは商売なので必ず胴元が儲かるようになっているからです。

あ、あと、大事な概念ですが、ボーダー理論では、パチンコが完全確率であると仮定しています。巷では店が遠隔で操作して、確率を変えているといったことが噂されますが、今は都市伝説レベルのようです。摘発されるとタイーホなので。。。

完全確率なら店はどうやって利益調整しているの?

ゲームの抽選の部分の確率はパチンコの場合は絶対にいじられてないと言っていいでしょう。それでは、どこで調整しているのか?

「釘」です。

ヘソに行くまでのルートには釘が無数に配置されています。その釘を叩いて曲げる事によって、ヘソに入りやすくしたり入りにくくしたりしているようです。

でも、釘の調整もどうやら摘発の対象らしく、あくまで「メンテナンス」としてやっているだけみたいですがね。ハハっ

実際のボーダーを見てみる

ボーダーは1000円で回る回転数なので、1000円突っ込むごとに計算してプラスの台かマイナスの台か見極める必要があります。

パチンコの今日の回転数は、台の上のメーターを見ればわかるのですが、ボーダーは書いてありませんw(書いてあったら、みんなその台選んじゃうw)

x_1 = 1000円入れる前の回転数
x_2 = 1000円入れた後の回転数
とすると
border = x_2 - x_1

と計算する必要があります。(TeX使うと賢そうに見えるけど、ただのパチンカス)

毎回回転数を覚えておくのは面倒臭いので、スプレッドシートを自作して管理しています。[1]

実地調査のデータです。
ボーダー

かなりバラついていることがお分かりかと思います。右上に書いてある17.8が、攻略サイトで調べたこの機種のボーダーラインです。自分が打って回った平均が 16.16 で、基準よりマイナスなので短期的に勝てることがあったとしても、長期的にはこの台を打っていると損になります。

投資金額も計算できて便利!!()

愚直にRustでどのぐらい回せば当たりそうなのか計算してみる

最適化せずに愚直に書いてみます。

use rand::{self, Rng};

const BORDER: f32 = 17.8;
const ATARI_NUM: i32 = 7; // 0~319のレンジならなんでもいい

fn main() {
    let mut rng = rand::thread_rng();

    let mut sum = 0.0;
    let mut sum_count = 0;

    loop {
        let mut count = 0;

        loop {
            count += 1;
            let num = rng.gen_range(0..319);
            if num == ATARI_NUM {
                break;
            }
        }

        let cost = count as f32 / BORDER * 1000.0;

        println!("あたり!試行回数: {count}, cost: {cost}");
        sum += cost;
        sum_count += 1;

        if sum_count > 1000000 {
            break;
        }
    }

    let avg_cost = sum / sum_count as f32;

    println!("平均 cost: {avg_cost}")
}

cargo run
...省略
あたり!試行回数: 6, cost: 337.07867
あたり!試行回数: 423, cost: 23764.045
あたり!試行回数: 300, cost: 16853.934
あたり!試行回数: 129, cost: 7247.1914
あたり!試行回数: 47, cost: 2640.4495
あたり!試行回数: 791, cost: 44438.207
あたり!試行回数: 119, cost: 6685.3936
あたり!試行回数: 301, cost: 16910.113
平均 cost: 17908.953

実行に、4m 9sかかりました。遅いなと思ったら、リリースビルドじゃありませんでした。

cargo run --release
...省略
あたり!試行回数: 285, cost: 16011.236
あたり!試行回数: 212, cost: 11910.113
あたり!試行回数: 523, cost: 29382.023
あたり!試行回数: 356, cost: 20000
あたり!試行回数: 221, cost: 12415.73
あたり!試行回数: 194, cost: 10898.877
あたり!試行回数: 1206, cost: 67752.81
あたり!試行回数: 49, cost: 2752.809
あたり!試行回数: 1374, cost: 77191.016
平均 cost: 17918.88

リリースビルドにしたら、39sになりました。

18000円ぐらい入れれば、1回は当たりが引けるかもしれないという結果が出ました。

並列化してCPUのコア数だけぶん回す

Rayonを使って、iterを並列化してもらいます。

use rand::{self, Rng};
use rayon::prelude::*;

const BORDER: f32 = 17.8;
const ATARI_NUM: i32 = 7; // 0~319のレンジならなんでもいい
const LIMIT: i32 = 1000000;
const THREAD_NUM: i32 = 8;

fn calc(limit: i32) -> i32 {
    let mut rng = rand::thread_rng();

    let mut sum = 0.0;
    let mut sum_count = 0;

    loop {
        let mut count = 0;

        loop {
            count += 1;
            let num = rng.gen_range(0..319);
            if num == ATARI_NUM {
                break;
            }
        }

        let cost = count as f32 / BORDER * 1000.0;

        // Buffringするとかしないと、syscall呼びすぎで遅い。
        // println!("あたり!試行回数: {count}, cost: {cost}");
        sum += cost;
        sum_count += 1;

        if sum_count > limit {
            break;
        }
    }

    (sum / sum_count as f32) as i32
}

fn main() {
    let a: i32 = (0..THREAD_NUM)
        .into_par_iter()
        .map(|_| calc(LIMIT / THREAD_NUM))
        .collect::<Vec<i32>>()
        .iter()
        .sum();

    println!("平均 cost: {:?}", a / THREAD_NUM);
}

❯ time cargo run --release
    Finished release [optimized] target(s) in 0.01s
     Running `target/release/pachinko`
平均 cost: 17939
cargo run --release  5.17s user 0.10s system 484% cpu 1.088 total

かなり速くなりました!1秒

結論

ボーダープラスの台で打ち続けましょう。最低でもミドル機で1万8000円ぐらいは溶かす勇気は必要。

まとめ

パチンコで絶対に勝てる方法がわかりました!

もし希望あればボーダー計算スプシ共有します!w欲しい方は TwitterのDMまで!

no plan株式会社について

脚注
  1. スプシと睨めっこしてパチンコ打つやつよwww ↩︎

Discussion