[PHP] 競馬の三連複の予想データと結果データの判定対応ロジック

2017年12月8日

PHP テクノロジー プログラミング

競馬サイトの構築を依頼され、改めて今まで知らなかった競馬のデータ分析ロジックに色々エンジニアとして勉強させられているこの頃ですが、競馬で最も難しく旨味の多い「三連単」の判定ロジックは非常にシンプルなのですが、三連複の判定ロジックが非常に手こずったので、ソースコードを含めて考え方をまとめておきます。

僕のような競馬素人の為に説明

まず、そもそも競馬の「三連単」と「三連複」という言葉すら知らない人の為に、超簡単に説明しておくと、 「三連単」とは、1着2着3着を順番も含めて予想する馬券の種類です。 「三連複」は、1着2着3着の馬番を予想するのは同じですが、順位不同でも構いません。 もちろん、三連単が、競馬の馬券の払戻金額で一番高い値がつくのですが、三連複はその次に高い値が付きます。 競馬の馬券を買ったことがある人はわかると思いますが、通常3着の馬を予想する時に、3つの馬番だけを購入するパターンはあまりありません。 もちろん、1点絞ってピンポイントで購入する人もいるかもしれませんが、多くの予想する人達は、 オッズ情報などを見ながら、手堅い上位順位の馬を1位予想にし、その次にくる紐(ヒモ)と呼ばれる馬には、手堅いもの数匹と、穴狙いの数匹を混ぜ合わせた数等を選択することが多いようです。 1レースで最大18頭走る順位を含めた3頭を当てる「三連単」に比べて、上位3位までの馬を予想する「三連複」は、比較的人気の高い馬券のようです。

組み合わせ購入について

上記で説明した予想の仕方は、「1着1頭流し」という事で、下記のように書かれます。
1-2,3,4,5
競馬通の人なら、これで馬券を買うことができるでしょうが、少し説明すると、 1位が「1番」、2位と3位が「2,3,4,5番」の馬を買うという事なんですね。
[1位] 1 -> [2位] 2,3,4,5 -> [3位] 2,3,4,5
要するにこのように馬券を購入するという事なんですね。 JRA | 馬券を購入するには 競馬の馬券は、組み合わせで買うのが一般的というのをJRAのページを見てもわかると思います。 この時に、「三連単」は、12パターンの組み合わせになり、「三連複」は6パターンの組み合わせになります。 なので、「三連単」は、1200円、「三連複」は、600円で購入できます。 ちなみに、この組み合わせが的中した時に、払い戻される額は、三連単の方が三連複よりも数倍多いので、悩ましいところですよね。 三連単の保険で三連複を買う人もいるようですが、いまの僕には何が正解なのかわかりません。

三連複の難しさ

上記の予想に対して、「2-1-3」という結果になった場合、三連単は、外れになります。 しかし、三連複は当たっているのですが、この判定が難しい。 それは、1位、2位、3位という各グループに、それぞれ存在するかをパターンで照合判定しなければいけません。 何故なら、順位不同なので、1位から2位の予想番号が入った配列に対して、どれかの中に且つ、それぞれ別々のグループに全てマッチしなければいけません。 パターンの照合判定というのは、以下のような考え方になります。
1位 2位 3位
1 2 3
3 1 2
2 3 1
3 2 1
1 3 2
2 1 3
三連単の場合は、一番上の列だけの判定でいいのに対して、三連複は、この6パターンの判定を行わなければいけません。 【注意】上位の1,2,3という値は、1位、2位、3位のそれぞれのグループという意味で数値にしています。

ソースコードにすると

$yoso = ["1","2,3,4,5","2,3,4,5"]; $rslt = ["2","1","3"]; for($i=0; $i<=2; $i++){ $num = array(); for($j=0; $j<=2; $j++){ $num[$j] = (($j+$i)>2)? $j+$i-3 : $j+$i; } if(in_array($rslt[$num[0]],$yoso[0]) && in_array($rslt[$num[1]],$yoso[1]) && in_array($rslt[$num[2]],$yoso[2])){ echo "HIT"; break; } if(in_array($rslt[$num[0]],$yoso[2]) && in_array($rslt[$num[1]],$yoso[1]) && in_array($rslt[$num[2]],$yoso[0])){ echo "HIT"; break; } }

解説

$yoso 変数は、予想のデータ、 $rslt 変数は、レース結果の着順の配列です。 これを、予想データに対して、着順データを上記6パターンの組み合わせをそれぞれ照合しているんですが、 最初のfor文に対して、その中で2回if文を行っているのは、三連複の6パターン照合のパターンが、「1,2,3」と「3,2,1」という数字の並びを、スライドさせる事で、全てを網羅できる事に気がつくと、このやり方が最も早くできると考えました。 パターンをスライドさせて、3グループの組み合わせを作り、in_arrayで、各グループに当たりが存在しているかのif文をそれぞれに行って、全てが当たりになった時に"HIT"文字を表示して、for文から抜けるという内容です。

複雑?いえ、シンプルなんです

プログラム初心者の人が見たら、こうした構文は複雑に見えるかもしれませんが、僕なりに非常にまとめ上げた内容になっているはずです。 もっと、プログラム自体は、関数化したり、短く書く構文にしたりすることは可能だと思うので、我こそはという方がいれば、コメントくださいませ。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。