Friction River Software

  • お問い合わせ

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

A子

予想の順位付けを行う方法だけどさ

奇数と偶数の組み合わせを考慮したらどうかな?

B美

三つの数字の組み合わせは下記の通りになるわ

パターン組み合わせ
①(奇数0+偶数3)偶偶偶
②(奇数1+偶数2)奇偶偶
偶奇偶
偶偶奇
③(奇数2+偶数1)奇奇偶
奇偶奇
偶奇奇
④(奇数3+偶数0)奇奇奇

単純にそれぞれが8分の1の確率で出現するとなると、パターン②とパターン③の出現確率はパターン①やパターン④の3倍になると考えられるわね

C菜

ボックスでの買い方なら、そうなりますね~

あと、マルコフ性を持つのなら、前回の結果が今回の結果に影響を与えないわけですけど、それも一緒に検証したいですね~
(もしかしたら「パターン①のすぐ後はパターン①が出やすい」…とかあるかもしれませんし~)

A子

よしっ!
それじゃ、検証コードを書いてみよう

「src/Controller/VerificationController.php」の中に「oddAndEvenAnalyze」メソッドを記述するよ

//奇偶検証
public function oddAndEvenAnalyze()
{
    set_time_limit(0);

    //numbersテーブルを検索(「実施回」の昇順)
    $numbers = $this->Numbers->find()->order(['lottery_time' => 'asc']);
    $numbers_array = $numbers->toArray();

    //[][0]…パターン①(奇数0+偶数3)
    //[][1]…パターン②(奇数1+偶数2)
    //[][2]…パターン③(奇数2+偶数1)
    //[][3]…パターン④(奇数3+偶数0)
    //[][4]…合計
    $result1 = [
        [0, 0, 0, 0, 0], //シングル
        [0, 0, 0, 0, 0], //ダブル
        [0, 0, 0, 0, 0] //トリプル
    ];

    //[][0]…パターン①(奇数0+偶数3)
    //[][1]…パターン②(奇数1+偶数2)
    //[][2]…パターン③(奇数2+偶数1)
    //[][3]…パターン④(奇数3+偶数0)
    //[][4]…合計
    $result2 = [
        [0, 0, 0, 0, 0], //パターン①(奇数0+偶数3)の次
        [0, 0, 0, 0, 0], //パターン②(奇数1+偶数2)の次
        [0, 0, 0, 0, 0], //パターン③(奇数2+偶数1)の次
        [0, 0, 0, 0, 0] //パターン④(奇数3+偶数0)の次
    ];

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

        //1回前
        $num3_place1_before = intval($numbers_array[$idx - 1]->num3_place1) % 2;
        $num3_place10_before = intval($numbers_array[$idx - 1]->num3_place10) % 2;
        $num3_place100_before = intval($numbers_array[$idx - 1]->num3_place100) % 2;
        $total_before = $num3_place1_before + $num3_place10_before + $num3_place100_before;

        //今回
        $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 ($num3_array_count == 3) {
            $type = 0;
        } elseif ($num3_array_count == 2) {
            $type = 1;
        } elseif ($num3_array_count == 1) {
            $type = 2;
        }

        //奇偶判定
        $num3_place1_current = intval($num3_place1) % 2;
        $num3_place10_current = intval($num3_place10) % 2;
        $num3_place100_current = intval($num3_place100) % 2;
        $total_current = $num3_place1_current + $num3_place10_current + $num3_place100_current;

        //結果集計
        $result1[$type][$total_current]++;
        $result2[$total_before][$total_current]++;
    }

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

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

見て分かるように「$result1」がパターン①~④の割合(ダブルやトリプルは別カウント)で、「$result2」が直前の結果に基づく出目パターンだよ



C菜

それではビューファイル(「templates/Verification/odd_and_even_analyze.php」)は私のほうで書きますね~

あと、表示に必要な定数定義(define関数呼出し)については「config/const.php」のほうへ移動しましたよ~
(もちろん、前回の「templates/Verification/pattern_analyze.php」についても書き換えました~)



B美

ふむ、良いんじゃない?
本番環境(サーバ)にアップロードしたら、以下のURLを叩いてみましょう

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

あ、下記の結果は2026年9月3日までの集計ね

A子

単純に(奇数・偶数の組み合わせ8通りが)8分の1(12.5%)の確率だったら、パターン①と④がそれぞれ12.5%で、パターン②と③がそれぞれ(3倍の)37.5%になるべきだよね

ダブルやトリプルを考慮しない予想の場合、シングルのみを見るわけだから、この結果はちょっと驚きだよ

C菜

シングルの予想においてはパターン①と④の出現確率が異常に低いってことですね~

これは順位付けをする上で、重要な情報ですよ~

B美

もう一つの集計結果である「奇偶検証(マルコフ性)」のほうは、まさに確率の理論値通りになったわね

多少の誤差は見られるけど、ほぼほぼ予想通りの結果よ

A子

…ってことは、パターンAとCの60通りの数字の中で、パターン①と④に該当するものは下位に沈めれば良いんだね?
てか、2026年の7月と8月の当選番号って、シングルに限定するとこうなってたよ

年月シングル個数パターン①または④の個数
2026年7月182
2026年8月152

ゼロじゃないのが懸念点ではあるけどね(苦笑)

B美

完璧に未来を予想することなんて不可能なんだから、それで良いんじゃない?

予想を立てるときの道標みちしるべになれば良いんだから…

C菜

あ、そうだ

もう一つ考えたんですけど~

A子

お
なになに?

C菜

随分前ですけど、各桁三つの数字の合計がどうなるかって話をしましたよね~?

B美

あったわね
(【WebAPI編⑬】を参照)

C菜

合計が13や16になることが多いわけですけど、それってシングルに限定した場合でもそうなんでしょうか~?

奇偶検証については(シングルでは)理論値と異なった結果になったので、調べてみたいです~

A子

面白いじゃん
んじゃ、「sumAnalyze」メソッドを書いてみよう

//合計検証
public function sumAnalyze()
{
    set_time_limit(0);

    //numbersテーブルを検索(「実施回」の昇順)
    $numbers = $this->Numbers->find()->order(['lottery_time' => 'asc']);

    $result = [ //[][0]…シングル,[][1]…ダブル,[][2]…トリプル
        [0, 0, 0], //0
        [0, 0, 0], //1
        [0, 0, 0], //2
        [0, 0, 0], //3
        [0, 0, 0], //4
        [0, 0, 0], //5
        [0, 0, 0], //6
        [0, 0, 0], //7
        [0, 0, 0], //8
        [0, 0, 0], //9
        [0, 0, 0], //10
        [0, 0, 0], //11
        [0, 0, 0], //12
        [0, 0, 0], //13
        [0, 0, 0], //14
        [0, 0, 0], //15
        [0, 0, 0], //16
        [0, 0, 0], //17
        [0, 0, 0], //18
        [0, 0, 0], //19
        [0, 0, 0], //20
        [0, 0, 0], //21
        [0, 0, 0], //22
        [0, 0, 0], //23
        [0, 0, 0], //24
        [0, 0, 0], //25
        [0, 0, 0], //26
        [0, 0, 0], //27
        [0, 0, 0] //合計
    ];

    //全件数分、ループを回す
    foreach ($numbers as $idx => $val) {
        $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 ($num3_array_count == 3) {
            $type = 0;
        } elseif ($num3_array_count == 2) {
            $type = 1;
        } elseif ($num3_array_count == 1) {
            $type = 2;
        }

        //3つの数字の合計
        $total = $num3_place1 + $num3_place10 + $num3_place100;

        //結果集計
        $result[$total][$type]++;
    }

    //合計計算
    for ($i = 0; $i < 3; $i++) {
        for ($j = 0; $j < 28; $j++) {
            $result[28][$i] += $result[$j][$i];
        }
    }

    $this->set(compact('result'));
}

もちろん「src/Controller/VerificationController.php」の中だからね



C菜

対応するビューファイル(「templates/Verification/sum_analyze.php」)はこうなりますね~

A子

んじゃ、サーバにアップしてっと…

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

上記のURLを叩いた結果はこうなるね
(やっぱり13と16が多いよ)


C菜

シングルに限定すれば、0から27までの28通りじゃなくて、3から24までの22通りになるんですね~

A子

この結果を見る限り、三つの数字の合計数が9から18までの10通りってのがめっちゃ目立つね

順位付けするための根拠の一つにはなりそう

B美

同意するわ
60通りの予想数字それぞれにスコア加算していく場合、こうしたらどうかしら?

三つの数字の合計加算する得点(スコア)
31
41
52
63
73
84
96
107
117
128
139
148
157
169
178
186
194
203
212
222
231
241

A子

ん?
その得点って、シングル内の構成比(パーセンテージ)かな?

C菜

みたいですね~
あ、だったら、奇偶判定の結果はこうでしょうか~?

パターン加算する得点(スコア)
①(奇数0+偶数3)9
②(奇数1+偶数2)41
③(奇数2+偶数1)42
④(奇数3+偶数0)9

こちらも構成比(パーセンテージ)ですよ~

B美

あとは大本の並び(出現時期の古い順)のスコアだけど…

候補数字の順位加算する得点(スコア)
1位60
2位59
~~
59位2
60位1

って感じで、第1位の60点から最下位の1点まで1点刻みでどうかしら?
(パターンAとCに限定するから、候補は必ず60通りよ)

C菜

このスコア付けに基づいて、予想順位の再計算を行ってみました~
(パターンAとパターンCで予想が的中したものだけですけど~)

年月日パターン的中時の元の順位再計算後の順位
2026/7/2A2位3位
2026/7/6C57位48位
2026/7/8C15位14位
2026/7/16A14位13位
2026/7/21A56位50位
2026/8/5A1位1位
2026/8/25C33位26位
2026/8/26C9位9位

総じて改善が見られますけど、劇的とは言い難いですね~(苦笑)

A子

うーん
三種類のスコア(古い順・奇偶判定・各桁の合計)の重みウェイトが適切じゃないのかな?

C菜

でも重みウェイトを調整した場合、7/2や8/5、8/26なんかの10位までに入ってたやつが11位以下になるかもしれませんよ~

A子

「彼方あちら立てれば此方こちらが立たぬ」だね

難しいなぁ(苦笑)

C菜

試しに、「三つの数字の合計」で加算する得点を5倍に変更してみました~

三つの数字の合計加算する得点(スコア)…構成比の5倍
35
45
510
615
715
820
930
1035
1135
1240
1345
1440
1535
1645
1740
1830
1920
2015
2110
2210
235
245

A子

お、どうなった?

C菜

こうなりましたよ~

年月日パターン的中時の元の順位再々計算後の順位
2026/7/2A2位3位→19位
2026/7/6C57位48位→46位
2026/7/8C15位14位→9位
2026/7/16A14位13位→10位
2026/7/21A56位50位→51位
2026/8/5A1位1位→2位
2026/8/25C33位26位→26位
2026/8/26C9位9位→8位

…ってことなので、悪化が1件、改善が2件ですね~
(「悪化」の定義は10位内が10位外に、「改善」の定義は10位外が10位内に)

B美

あなた、それ手計算でやってるの?

C菜

いえいえ、まさかですよ~

Excelを使って加算するスコアを変更するつど、的中順位が自動的に変動するようにワークシートを作ってみました~

A子

さすがはC菜だね
よっ、Excel職人!

C菜

vlookup関数やrank関数を使っただけで、そんなにたいしたことはしてませんよ~

B美

それすらできないA子という存在もいるからね

A子

うっ
うるさいわい!