CakePHP5入門【WebAPI編⑮】ナンバーズ3を予想②
A子
(あれって各数字のスコアを返すだけだったしね)
B美
どうするの?
C菜
問題はその組み合わせですね~
B美
例えば…
| 実施回 | 当選番号 |
|---|---|
| 第6921回 | 269 |
| 第6922回 | 979 |
| 第6923回 | 135 |
| 第6924回 | 918 |
のとき、スコアはこうなる(曜日と六曜の加算は除く)んだけど、第6925回の当選番号は「843」だったわけ
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 6 | 0 | 3 | 0 | 3 | 0 | 0 | 3 | 5 |
もしも「1」と「9」を軸にして予想した場合、全然ダメだったという…(苦笑)
(ただ、スコア3点の「3」と「8」は出現してるんだけどね)
C菜
例えば、第5回目から最新回までのスコアを全て算出して、それを一覧表示してみるってどうでしょう~?
A子
「VerificationController」って名前で良いかな?
C菜
「MATE端末」上でこう入力しましょう~
|
cd html/numapp[Enter]
bin/cake bake controller verification[Enter] |
「src/Controller/VerificationController.php」が生まれるので、中身を全て削除しておきますね~
あと、Numbersテーブルのフェッチについても書いておきました~
A子
基本的には「TopController」クラスの「pulling3」メソッドを参考にすれば良いよね
(「引っ張り」を検証したやつ)
スコア計算については「ApiController」クラスの「num3Prediction」メソッドの中身を使ったよ
|
//検証用01
public function score01() { //numbersテーブルを検索(「実施回」の昇順) $numbers = $this->Numbers->find()->order(['lottery_time' => 'asc']); $numbers_array = $numbers->toArray(); $result = []; //全件数分、ループを回す foreach ($numbers as $idx => $val) { //最初の4件はとばす if ($idx < 4) continue; //この回の結果を初期化 $record = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $val->lottery_time, $val->num3_str]; //フラグ配列 $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; } } //結果配列に追加 array_push($result, $record); } $this->set(compact('result')); } |
どうよ!
B美
まぁ、良いんじゃない?
C菜
templatesの下に「Verification」ディレクトリを作って、そこに「score01.php」を作りましたよ~
(中身はほとんど「templates/Top/pulling3.php」からのコピーですけど~)
A子
ブラウザのURL欄に直接以下の一文を入力してっと…
| http://192.168.1.205/numapp/verification/score01 |
・・・
B美
ただ、予想スコアと当選数字の関係が分かりにくいんじゃないかしら
(当たってんだか、当たってないんだか…よく分からん(苦笑))
C菜
A子
あー、でもビューファイルだけの変更でいけるかな?
C菜
B美
| $record = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $val->lottery_time, $val->num3_str]; |
の箇所を
|
$record = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $val->lottery_time, $val->num3_str, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
$record[$val->num3_place1 + 12]++; $record[$val->num3_place10 + 12]++; $record[$val->num3_place100 + 12]++; |
に変更しましょう
C菜
良いと思います~
A子
CSSの「td4」クラスで分かる通り、背景色は黄色にしてみた
C菜
・・・
A子
しっかし、得点が有って(1点以上で)当たってるパターンって、0個のケースから3個のケースまであるけどさ
だいたい、1個か2個しか当たってないね(苦笑)
C菜
これはスコア計算アルゴリズムに問題があるのでは~?
B美
| ケース | スコア | 備考 |
|---|---|---|
| 1回前に出現 | +6 | ○◎ |
| 1回前に出現せず かつ2回前に出現 | +5 | ○×◎ |
| 1回前に出現し かつ2回前に出現 (3回前は出現せず) | -3 | ×○○◎ |
| 1回前から3回前まで全て出現 | -4 | ○○○◎ |
| (1回前または2回前の どちらかに出現していて、かつ) 3回前に出現 | -2 | ○×○◎,○○×◎ |
| (2回前だけに出現していて、かつ) 4回前に出現 | -3 | ○×○×◎ |
これでどうかしら?
C菜
B美
3連続以上の「引っ張り」がそれほど出現しなくなるって傾向を考えると妥当じゃない?
A子
結果を見ながら調整していけば良いじゃん
C菜
それでは「score02」メソッドを作りましょう~
A子
|
//検証用02
public function score02() { //numbersテーブルを検索(「実施回」の昇順) $numbers = $this->Numbers->find()->order(['lottery_time' => 'asc']); $numbers_array = $numbers->toArray(); $result = []; //全件数分、ループを回す foreach ($numbers as $idx => $val) { //最初の4件はとばす if ($idx < 4) continue; //この回の結果を初期化 $record = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $val->lottery_time, $val->num3_str, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; $record[$val->num3_place1 + 12]++; $record[$val->num3_place10 + 12]++; $record[$val->num3_place100 + 12]++; //フラグ配列 $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] += 6; $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) { if ($pre1[$num] == 0) { $record[$num] += 5; $pre2[$num] = 1; } else { $record[$num] -= 3; } } //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) { $record[$num] -= 1; } elseif ($pre1[$num] == 1 || $pre2[$num] == 1) { $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] -= 3; } } //結果配列に追加 array_push($result, $record); } $this->set(compact('result')); } |
ビューファイルの「score02.php」については、「score01.php」の中身と全く同じになるね
(ファイル名を変更しただけ)
C菜
| http://192.168.1.205/numapp/verification/score02 |
なんとなく、こっちのほうが良さそうです~
・・・
B美
だったら、「num3Prediction」メソッドが返すJSONデータとして、こっちのスコアも追加したらどうかしら?
要するに、二種類のスコアを返すってわけ…
連続加点アルゴリズム(score01)と連続減点アルゴリズム(score02)ってことになるかな
C菜
下手に予想してクレームになるより、スコアだけを提示して、あとは各人の予想に任せると~(笑)
A子
まぁ、良いか
「num3Prediction」メソッドの後半部分のみを表示するよ
(赤色の部分が追加した箇所ね)
C菜
「過去の実績はこちら」の部分は「verification/score01」や「verification/score02」へのリンクです~
B美
それじゃ、本番サーバにアップして誰でもアクセスできるようにしましょう
C菜
(⑨のタブです~)
A子
当てになるかどうかは分からんけど…(苦笑)


