◯◯独自の乱数生成方式を考察

考察 ◯◯独自の乱数生成方式

案外オカルトとも言い切れないよって話。プログラマー目線で切り込んでみようと思う。

パチスロ開発者ではないから、あくまでもコンピュータとかプログラムってこういうものだよって知識の中から妄想してみた。

目次

抽選のタイミング

これはもう常識だと思うけど、パチンコはスタートチャッカーを通過した瞬間、パチスロはレバーオンした瞬間に出玉に直結する当たりの抽選をする。

出玉に関係のない演出の選択はその限りではないし、パチスロならストップボタンを押したタイミングで演出の展開を枝分かれさせているものもあると思う。

某裏研修の店長が動画でパチンコの抽選は保留が消化される瞬間だと言い切っていて、仕組みが変わったのかと驚いた。じゃぁ先読みや保留変化はどう処理してるんだ?と。演出の抽選はそうかもしれないが当落抽選はチャッカー入賞時のはず。現役のパチ屋店長がそういう認識ということに驚いたね。商品を提供する側なんだから全機種全演出の期待度までとは言わないけど、根本的な仕組みぐらいは知っててほしいな。

あまちょこ

あれ以来、裏研修はほとんど見なくなったぜ。

怪しい偏り

あるよね、たまたまにしてはできすぎた偏り。

スイカの次ゲームに強めな演出で、もらった!と思ったらまたスイカ。1000ハマりの後に1ゲーム連。心当たりはいくつもあるはず。

もちろんたまたまでもあり得るっちゃあり得るんだけど、世間一般ではまず考えにくい偏りがパチ屋の中では日常茶飯事だと思わない?まぁそれがまた醍醐味でもあるわけだが。

ちょっと話は変わって、昔ゲームを自作していたときのこと。

プログラムで乱数を使って敵キャラの進行方向をランダムにしたつもりが、何回試しても全く同じパターンで動いてしまう現象が起こった。

あまちょこ

確か小学生か中学生のころ、BASICで作ってたな。

ゲーム以外にも暗号化などで乱数を扱うプログラムを組んだことがある人なら何が悪かったかすぐにわかるはずだが、当時はインターネットもなく、頼りになるのは分厚いリファレンスマニュアルの難しい言葉で書かれた短い説明だけ。結構悩んだね。

もったいぶっても仕方ないので答えを書いてしまうと、原因は乱数を生成する関数にSeed(種)を渡していなかったこと。俺の知る限りではどのプログラム言語も同じで、乱数を生成する関数を呼び出すごとに異なったSeedを渡さないとランダムな値が返ってこないのだ。

あまちょこ

実務でよくやるパターンは、関数を呼び出す瞬間の現在日時をミリ秒単位でSeedとして渡すことによって確実に毎回違う値を取得するよね。

乱数って毎回違う値がほしいから使うのに、毎回きっちり同じ値が取れてしまう。パチンコ・パチスロの抽選でこの現象を意図的に起こせるとしたら・・・。

乱数を生成してみよう

言葉だけではわかりにくいと思うので、実際に好きな値をSeedに設定するとそれをもとに10個の乱数を生成して画面に表示する簡単なテストプログラムをJavascriptで作ってみたぜ。

次の画面を開いて、テキストボックスに好きな値を入れてボタンを何回か押してみてくれ。値を変えない場合、全く同じ10個の乱数を表示されるはずだ。値を変えると毎回違う乱数が表示されるだろ?

テキストボックスを空欄でボタンを押すと現在日時をSeedに指定するようにしてあるから、毎回違う乱数が表示される。

ソースコード抜粋

乱数生成部分はこんな感じ。

function generateRandomNumbers() {
    var seed = document.getElementById("seed").value;
    var randomNumbersDiv = document.getElementById("randomNumbers");
    randomNumbersDiv.innerHTML = "";

    if (seed.trim() === "") {
        seed = Date.now().toString();
    }

    Math.seedrandom(seed);

    for (var i = 0; i < 10; i++) {
        var randomNumber = Math.random().toFixed(10);
        var paddedIndex = pad(i + 1, 2);
        var randomNumberText = document.createTextNode("Random Number " + paddedIndex + ": " + randomNumber);
        var br = document.createElement("br");
        randomNumbersDiv.appendChild(randomNumberText);
        randomNumbersDiv.appendChild(br);
    }
}

テキストボックスが空だったら現在日時をSeedに設定。空じゃなかったら入力された値をSeedに設定。あとは math.random() 関数を10回呼び出して結果を表示しているだけ。

まとめ

乱数は意図的に偏らせるどころか、ある程度思い通りにコントロールできるということがおわかりいただけただろうか。

今後はフラグやビットなど、知っているとパチンコ・パチスロがより楽しめるであろうコンピュータ用語を解説してみようと思うよ。

あまちょこ

確率分母の8192ってなんで8000とか8200とかキリの良い数字にしねーの?とかね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次