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菜
あと、表示に必要な定数定義(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子
ダブルやトリプルを考慮しない予想の場合、シングルのみを見るわけだから、この結果はちょっと驚きだよ
C菜
これは順位付けをする上で、重要な情報ですよ~
B美
多少の誤差は見られるけど、ほぼほぼ予想通りの結果よ
A子
てか、2026年の7月と8月の当選番号って、シングルに限定するとこうなってたよ
| 年月 | シングル個数 | パターン①または④の個数 |
|---|---|---|
| 2026年7月 | 18 | 2 |
| 2026年8月 | 15 | 2 |
ゼロじゃないのが懸念点ではあるけどね(苦笑)
B美
予想を立てるときの道標になれば良いんだから…
C菜
もう一つ考えたんですけど~
A子
なになに?
C菜
B美
(【WebAPI編⑬】を参照)
C菜
奇偶検証については(シングルでは)理論値と異なった結果になったので、調べてみたいです~
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菜
A子
| https://friction-river.jp/numapp/verification/sum_analyze |
上記のURLを叩いた結果はこうなるね
(やっぱり13と16が多いよ)
C菜
A子
順位付けするための根拠の一つにはなりそう
B美
60通りの予想数字それぞれにスコア加算していく場合、こうしたらどうかしら?
| 三つの数字の合計 | 加算する得点(スコア) |
|---|---|
| 3 | 1 |
| 4 | 1 |
| 5 | 2 |
| 6 | 3 |
| 7 | 3 |
| 8 | 4 |
| 9 | 6 |
| 10 | 7 |
| 11 | 7 |
| 12 | 8 |
| 13 | 9 |
| 14 | 8 |
| 15 | 7 |
| 16 | 9 |
| 17 | 8 |
| 18 | 6 |
| 19 | 4 |
| 20 | 3 |
| 21 | 2 |
| 22 | 2 |
| 23 | 1 |
| 24 | 1 |
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/2 | A | 2位 | 3位 |
| 2026/7/6 | C | 57位 | 48位 |
| 2026/7/8 | C | 15位 | 14位 |
| 2026/7/16 | A | 14位 | 13位 |
| 2026/7/21 | A | 56位 | 50位 |
| 2026/8/5 | A | 1位 | 1位 |
| 2026/8/25 | C | 33位 | 26位 |
| 2026/8/26 | C | 9位 | 9位 |
総じて改善が見られますけど、劇的とは言い難いですね~(苦笑)
A子
三種類のスコア(古い順・奇偶判定・各桁の合計)の重みが適切じゃないのかな?
C菜
A子
難しいなぁ(苦笑)
C菜
| 三つの数字の合計 | 加算する得点(スコア)…構成比の5倍 |
|---|---|
| 3 | 5 |
| 4 | 5 |
| 5 | 10 |
| 6 | 15 |
| 7 | 15 |
| 8 | 20 |
| 9 | 30 |
| 10 | 35 |
| 11 | 35 |
| 12 | 40 |
| 13 | 45 |
| 14 | 40 |
| 15 | 35 |
| 16 | 45 |
| 17 | 40 |
| 18 | 30 |
| 19 | 20 |
| 20 | 15 |
| 21 | 10 |
| 22 | 10 |
| 23 | 5 |
| 24 | 5 |
A子
C菜
| 年月日 | パターン | 的中時の元の順位 | 再々計算後の順位 |
|---|---|---|---|
| 2026/7/2 | A | 2位 | 3位→19位 |
| 2026/7/6 | C | 57位 | 48位→46位 |
| 2026/7/8 | C | 15位 | 14位→9位 |
| 2026/7/16 | A | 14位 | 13位→10位 |
| 2026/7/21 | A | 56位 | 50位→51位 |
| 2026/8/5 | A | 1位 | 1位→2位 |
| 2026/8/25 | C | 33位 | 26位→26位 |
| 2026/8/26 | C | 9位 | 9位→8位 |
…ってことなので、悪化が1件、改善が2件ですね~
(「悪化」の定義は10位内が10位外に、「改善」の定義は10位外が10位内に)
B美
C菜
Excelを使って加算するスコアを変更するつど、的中順位が自動的に変動するようにワークシートを作ってみました~
A子
よっ、Excel職人!
C菜
B美
A子
うるさいわい!


