Friction River Software

  • お問い合わせ

CakePHP5入門【WebAPI編㉒】ナンバーズ3を予想⑥

A子

前回ダブルやトリプルの出現確率の話をしたけどさ

過去の分、約7000回分の結果をまとめてみようよ

C菜

ダブルやトリプルが何回出現したかってことでしょうか~?

A子

そうそう

あ、パターン別に統計を取るのも良いかもね
(パターンAからパターンCまで)

B美

2026年7月分は、ダブル・トリプルが全てパターンBだったものね

ついでに、パターン別のスコア的中状況も取得してみてはどうかしら?

C菜

たしかに、パターンA・B・Cの予想方法って、感覚頼みで適当でしたもんね~(苦笑)

定量的に根拠を示すのは良いと思います~

A子

よし
それじゃ、検証用コードだから「src/Controller/VerificationController.php」を使おう

この中に新たなメソッドを作れば良いね

C菜

以前作った「score01」メソッドをコピーして、「patternAnalyze」メソッドを作りましょう~

//パターン別スコア検証
public function patternAnalyze()
{
    set_time_limit(0);

    //numbersテーブルを検索(「実施回」の昇順)
    $numbers = $this->Numbers->find()->order(['lottery_time' => 'asc']);
    $numbers_array = $numbers->toArray();
    $result1 = [ //正解が[][0]…0個,[][1]…1個,[][2]…2個,[][3]…3個,[][4]…合計
        [0, 0, 0, 0, 0], //パターンA(スコア有り4つ)
        [0, 0, 0, 0, 0], //パターンB(スコア有り5つ)
        [0, 0, 0, 0, 0], //パターンC(スコア有り6つ)
        [0, 0, 0, 0, 0] //その他
    ];
    $result2 = [ //[][0]…シングル,[][1]…ダブル,[][2]…トリプル,[][3]…合計
        [0, 0, 0, 0], //パターンA(スコア有り4つ)
        [0, 0, 0, 0], //パターンB(スコア有り5つ)
        [0, 0, 0, 0], //パターンC(スコア有り6つ)
        [0, 0, 0, 0] //その他
    ];

    //全件数分、ループを回す
    foreach ($numbers as $idx => $val) {
        //最初の4件はとばす
        if ($idx < 4) continue;

        //この回の結果を初期化
        $record = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

        //フラグ配列
        $pre1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; //1回前に出現しているか(出現した場合「1」)
        $pre2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; //2回前に出現しているか(出現した場合「1」)
        $pre3 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; //3回前に出現しているか(出現した場合「1」)

        //1回前
        $num3_place1 = $numbers_array[$idx - 1]->num3_place1;
        $num3_place10 = $numbers_array[$idx - 1]->num3_place10;
        $num3_place100 = $numbers_array[$idx - 1]->num3_place100;
        $num3_array = [$num3_place100, $num3_place10, $num3_place1];
        $num3_array = array_unique($num3_array); //重複排除
        foreach ($num3_array as $num) {
            $record[$num] += 3;
            $pre1[$num] = 1;
        }

        //2回前
        $num3_place1 = $numbers_array[$idx - 2]->num3_place1;
        $num3_place10 = $numbers_array[$idx - 2]->num3_place10;
        $num3_place100 = $numbers_array[$idx - 2]->num3_place100;
        $num3_array = [$num3_place100, $num3_place10, $num3_place1];
        $num3_array = array_unique($num3_array); //重複排除
        foreach ($num3_array as $num) {
            $record[$num] += 3;
            $pre2[$num] = 1;
        }

        //3回前
        $num3_place1 = $numbers_array[$idx - 3]->num3_place1;
        $num3_place10 = $numbers_array[$idx - 3]->num3_place10;
        $num3_place100 = $numbers_array[$idx - 3]->num3_place100;
        $num3_array = [$num3_place100, $num3_place10, $num3_place1];
        $num3_array = array_unique($num3_array); //重複排除
        foreach ($num3_array as $num) {
            if ($pre1[$num] == 1 && $pre2[$num] == 1) {
                //1回前と2回前の両方に出現している場合、何もしない
            } elseif ($pre1[$num] == 1 || $pre2[$num] == 1) {
                //1回前と2回前のどちらかに出現している場合、3回目にも出現していれば加点
                $record[$num] += 2;
                $pre3[$num] = 1;
            }
        }

        //4回前
        $num3_place1 = $numbers_array[$idx - 4]->num3_place1;
        $num3_place10 = $numbers_array[$idx - 4]->num3_place10;
        $num3_place100 = $numbers_array[$idx - 4]->num3_place100;
        $num3_array = [$num3_place100, $num3_place10, $num3_place1];
        $num3_array = array_unique($num3_array); //重複排除
        foreach ($num3_array as $num) {
            if ($pre1[$num] == 0 && $pre2[$num] == 1 && $pre3[$num] == 0) {
                //2回前だけに出現している場合、4回目を見る
                $record[$num] += 1;
            }
        }

        //各数字のスコアを判定
        $scoreMore = []; //スコア1以上
        foreach ($record as $num => $value) {
            if ($value > 0) {
                array_push($scoreMore, $num);
            }
        }
        $scoreMoreCount = count($scoreMore);

        //この回の当選番号
        $num3_place1 = $val->num3_place1;
        $num3_place10 = $val->num3_place10;
        $num3_place100 = $val->num3_place100;
        $num3_array = [$num3_place100, $num3_place10, $num3_place1];
        $num3_array = array_unique($num3_array); //重複排除
        $num3_array_count = count($num3_array);

        //パターン別シングル・ダブル・トリプルの個数
        if ($scoreMoreCount >= 4 && $scoreMoreCount <= 6) {
            $pat = $scoreMoreCount - 4;
        } else {
            $pat = 3;
        }
        if ($num3_array_count == 3) {
            $type = 0;
        } elseif ($num3_array_count == 2) {
            $type = 1;
        } elseif ($num3_array_count == 1) {
            $type = 2;
        }
        $result2[$pat][$type]++;

        //パターン別正解個数(ダブルやトリプルは除外)
        if ($type == 0) {
            $hit = 0;
            foreach ($num3_array as $value) {
                if (in_array($value, $scoreMore)) {
                    $hit++;
                }
            }
            $result1[$pat][$hit]++;
        }
    }

    //合計計算
    for ($i = 0; $i < 4; $i++) {
        $result1[$i][4] = $result1[$i][0] + $result1[$i][1] + $result1[$i][2] + $result1[$i][3];
    }
    for ($i = 0; $i < 4; $i++) {
        $result2[$i][3] = $result2[$i][0] + $result2[$i][1] + $result2[$i][2];
    }

    $this->set(compact('result1', 'result2'));
}

「$result1」がスコア的中状況で、「$result2」がダブルやトリプルの数です~
(どちらもパターン別で取得してますよ~)





B美

さすがはC菜ね

(実行してみないと分からないけど)多分、大丈夫そうよ

A子

んじゃ、対応するビューファイルを「templates/Verification/pattern_analyze.php」として作ろう

あ、見栄えは考慮してないよ
(あくまでも検証用だからね)


B美

それでは実行確認してみましょう

https://friction-river.jp/numapp/verification/pattern_analyze

ちなみに、下記は2026年7月31日(第7039回)までの集計結果よ
(「パターン別【スコア的中】個数」については、シングルのみの集計)

C菜

ダブルやトリプルの出現確率が、ほぼ理論値通りです~

あと、パターンごとの違いは見られませんね~
(2026年7月については、ダブル・トリプルが全てパターンBでしたけど~)

A子

てか、ちょっと待って

スコア的中個数のパターンBって、「正解1個」と「正解2個」の割合が拮抗してるじゃん
(どっちも42%)

C菜

パターンAとパターンCの予想方法に問題は無いみたいですけど、パターンBだけは問題ですね~

パターンBのケースは「予想不能パターン(宝くじを購入しない)」にしたほうが良いかもです~

B美

私もその意見に賛成よ

こうして数字として見ると説得力があるわよね

A子

予想可能なケースが全体の半分以下になっちゃうけどね(苦笑)
(パターンBの占める割合が大きいから…)

B美

でも、これってシングルの出現確率が約72%で、その中の半分(50%)が予想的中することになるわよね

0.72×0.5で0.36…つまり、36%の予想的中確率になるわけよ

C菜

理論値とほぼ一緒じゃないですか~(笑)

それを予想と言えるのでしょうか~

A子

だね
意味ないじゃん(苦笑)

B美

いいえ、そうとも言えないわ

パターンAとパターンCはどちらもボックス値として60通りの予想になるけど、重要なのはその全てを購入するのは現実的じゃない…ってことなの
(宝くじ購入用のマークシートを塗りつぶしていくのも大変だし…(苦笑))

要するに、予想上位の限られた個数のみを購入すればどうか…ってこと

C菜

たしかにそうですね~

(確率的に)3回に1回は的中する(60通りの中に当選番号が存在する)わけですから、そのときの購入口数を少なくした状態で当てることができれば、十分に利益が出るはずです~

A子

あっ、そうか!

1回当たり2000円分を購入して3回に1回当てられれば、6000円の元手で1~2万円をゲットできるってことになるね
(十分に黒字だよ)

C菜

10通り(2000円分)を購入する場合、(ランダムならば)確率的には6分の1になるわけですけど、それを2分の1くらいに向上させることができれば良いわけですね~

ただ、順位付けの方法ですけど、前回の「出現時期の古い順」ではうまくいかなそうですよね~
(2026年7月の結果を見ると…)

どうしましょう~?

B美

とりあえず、それについては各人の宿題ね



A子

時は流れて、9月になったよ

B美

誰に説明してるのよ(苦笑)

C菜

2026年8月分の結果を集計してみましょう~

A子

あ、その前に!
前回、7月分を集計した結果って赤字だったじゃん?

これをパターンAとCのみに限定して、かつ予想上位の10通りだけ購入した場合をシミュレートしてみたよ
すると、わずかだけど黒字になってるんだよね

C菜

それでは、次に8月分の結果を発表しますね~
予想の上位10通りだけを購入した場合ですけど~

・パターンA・B・C全て
・パターンA及びパターンCのみ(パターンBを除外)

のどちらも黒字になりましたよ~

A子

いや、これってすごくない?

B美

「偶然」という評価について、それを否定することができないわね

A子

難しい言い回しをしてるけど、「たまたま」だって言いたいんでしょ?

まったく頭の良い人間はこれだから…(苦笑)

C菜

でも、まだ二か月(7月分と8月分)ですからね~

年末くらいまでは結果を集計してみないと、分からないと思いますよ~

B美

それよりも「宿題」は考えてきたでしょうね?

A子

ん?
何だっけ?

C菜

予想の「順位付けを行う方法」の見直しですよ~
もっとも、8月については現状のやり方(出現時期の古い順)で十分でしたけどね~

・8月5日…1位
・8月26日…9位
・8月27日…10位

で、的中してますし~

B美

そうなのよね(困り顔)

とりあえずは、もう少し様子を見ましょうか

A子

だね

結果が伴っているものをわざわざ変えることもないし…(苦笑)