1.きっかけ
ここ1年半話題といえば「コロナ絶賛感染拡大中!一年半前の数人から今は5000人に伸びました!」
という話でニュースがにぎわっている。
オリンピックで日本経済が盛り上がる予定だったけど、夢に終わってしまった。
さらに、と悪いことを挙げればきりがない。
そんな暗い空気を背負って、テレワークを終えて近所を歩いていた。
私と同じ暗い空気をまといながらも、やけに野望に燃えた目の人々が集まっている場所がある。
高額当選を叩き出した宝くじ売り場だ。
その集まりの先に「キャリーオーバー発生中!」「サマージャンボ」のポスターが見えた。
「では〇〇と〇〇で五万円になります。」と無機質な店員さんの声も聞こえる。
渋い顔をしたオジサンが、財布からお札を取り出している。
サマージャンボやロトの当選金額の大きさと、列に並ぶ人の熱気に呑まれてしまった。
「これもし当たったら、どうしよう???」と根拠のない自信が溢れ出してきた。
サマージャンボは、自分で番号を決められないけど、ロト6、ロト7は自分で番号を決められるということも分かった。
しかもキャリーオーバー発生中で、当選金額も大きくなっている。
ロト6は毎週結果がわかるということも、サマージャンボより、1等当選の確率がわずかに高いことも大きな興味を持った。
ロト6だと1から43までの数字から、重複しない6つの数字を選ぶことができる。
でもいざとなると、どうやって数字を選べばいいかわからない。
とりあえずクイックピック(機械が自動で6つの数字の組み合わせを出してくれる仕組み)でトライをしてみた。
結果発表前日は眠れなかった。当たったらどうしようと緊張をしていた。
慌てないように1等当選したときのリハーサルも頭の中で重ねてきた。
結果はどうだったかというと
【清々しいまでに外れていた(泣)】
何一つ、自分で努力もしなかった癖に、もの凄く悔しかった。
「確実に一等当選する方法は、6,096,454通りの数字の組み合わせでロト6を購入する事。」
ただ、それだと憶単位のマイナスになってしまう。
その事実を知った時の心境は。。。
某有名漫画の登場人物のセリフを思い出した。
到底勝てない敵に立ち向かった時のあのセリフ。
『どうせ死ぬなら戦って死ぬ』
自分で番号を決められるのに人任せにする事はない。
どうせコロナが怖くてどこにも出られないのだ。
クイックピックを自作してみようと考えた。
2.目標
- 申し込み口数分で重複しない第一数字~第六数字の組み合わせを表示したい。(全桁自動のものと、一桁好きな数字を含むもの)
- 過去の当選番号以外の申し込み候補番号を表示したい。
3.実行環境
xamppのバージョン:7.2.3
eclipseのバージョン:Version: 2019-12 (4.14.0)
mariadbのバージョン:10.1.31
java:11
OS:windows10 home 64bit
4.実装
※キャリーオーバー中かや、ボーナス数字の情報は入れていません。
package model;
public class LotoBean1 {
private int n_cnt;
private int like_num;
private String lot6_str;
public int getN_cnt() {
return n_cnt;
}
public void setN_cnt(int n_cnt) {
this.n_cnt = n_cnt;
}
public String getLot6_str() {
return lot6_str;
}
public void setLot6_str(String lot6_str) {
this.lot6_str = lot6_str;
}
public int getLike_num() {
return like_num;
}
public void setLike_num(int like_num) {
this.like_num = like_num;
}
}
メモ1)ArrayListは、要素数を自由に変更できるので便利
メモ2)要素を追加する場合は ArrayList配列名.Add(追加したい値)
メモ3)特定の要素を削除する場合はArrayList配列名.remove(削除したい値の要素番号)
メモ4)ArrayListの全要素を削除するのは配列名.clear
メモ5)ある要素が対象のArrayListに含まれるかを調べるのはArrayList配列名.contains(調べたい値):含まれる場合はtrue
package model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
public class CalcLotoBean {
public void execute(LotoBean1 loto1) {
int cnum0=loto1.getN_cnt();
int like_num0=loto1.getLike_num();
String ret_loto6=getlot6data(cnum0,like_num0);
loto1.setLot6_str(ret_loto6);
}
private String getlot6data(int cnum,int like_num2) {
String retstr="";
String tmpstr="";
//計算回数が6096454を超えたときにfalse
boolean flg=true;
//カンマで連結した6つの数字の文字列を格納する配列
ArrayList<String> lotoarr = new ArrayList<>();
int i=0;
long n=0;
while(i<cnum) {
int chk_flg=0;
tmpstr=make_6number(like_num2);
//tmpstrがlotoarrにない場合
if(lotoarr.contains(tmpstr) == false ) {
chk_flg=check_uniqedata(tmpstr);
if(chk_flg==2) {
return "その他のエラー発生<br>";
}
if(chk_flg==0) {
lotoarr.add(tmpstr);
i++;
}
}
if(n>6096454) {
flg=false;
break;
}
n++;
}
if(flg==false) {
return "組み合わせが存在しません<br>";
}
for(i=0;i<cnum;i++) {
if(i>0) {
retstr=retstr+"<br>"+lotoarr.get(i);
}else {
retstr=retstr+lotoarr.get(i);
}
}
return retstr;
}
private String make_6number(int like_num2) {
String tmpstr="";
//ランダムに選ばれる番号を入れる配列
ArrayList<Integer> arrrandom=new ArrayList<>();
int len1=6;
if(like_num2>0) {
len1=5;
}
int[] tmpnum= new int[6];
//最終の位置に好きな番号を入れる
if(like_num2>0) {
tmpnum[5]=like_num2;
}
//1から43までをarrrandomに入れる
for(int k=0;k<43;k++) {
if(like_num2>0) {
//好きな番号は追加しない。
if(like_num2!=k+1) {
arrrandom.add(k+1);
}
}else {
arrrandom.add(k+1);
}
}
for(int j=0;j<len1;j++) {
int num0=(int)(Math.random()*arrrandom.size());
tmpnum[j]=arrrandom.get(num0);
//arrrandomから既に選ばれたtmpnum[j]を削除する
arrrandom.remove(arrrandom.indexOf(tmpnum[j]));
}
//全要素の削除
arrrandom.clear();
//配列のソート
Arrays.sort(tmpnum);
for(int j=0;j<6;j++) {
if(j>0) {
tmpstr=tmpstr+","+tmpnum[j];
}else {
tmpstr=tmpstr+""+tmpnum[j]+"";
}
}
return tmpstr;
}
//既にDBに登録されている番号と重複していないかチェック
private int check_uniqedata(String checkstr) {
final String URL
= "jdbc:mariadb://localhost:3306/loto6_db?useUnicode=true&characterEncoding=utf8mb4";
String USER = "root";
String PASS = "";
int [] chknum={0,0,0,0,0,0};
String[] tmpstr0=checkstr.split(",");
for(int i=0;i<6;i++) {
chknum[i]=Integer.parseInt(tmpstr0[i]);
}
final String sql = "select * from loto6_tbl where num1=? and num2=? and num3=? and num4=? and num5=? and num6=?";
try(Connection conn =
DriverManager.getConnection(URL, USER, PASS)){
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(sql);
for(int i=0;i<6;i++) {
ps.setInt(i+1,chknum[i]);
}
try(ResultSet rs = ps.executeQuery()){
//条件を満たすレコードが存在しないとき
if(!rs.next()) {
return 0;
//条件を満たしたレコードが存在するとき
}else {
return 1;
}
} catch (Exception e) {
conn.rollback();
System.out.println("rollback");
return 2;
}
}catch(Exception e) {
e.printStackTrace();
return 2;
}finally {
System.out.println("処理が完了しました");
}
}
}
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.CalcLotoBean;
import model.LotoBean1;
/**
* Servlet implementation class Loto6Servlet
*/
@WebServlet("/Loto6Servlet")
public class Loto6Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Loto6Servlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
RequestDispatcher dispatchar=request.getRequestDispatcher("input_loto.jsp");
dispatchar.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
if (request.getParameter("btn_auto") != null) {
//口数
int select_num=Integer.parseInt(request.getParameter("sel_num"));
//好きな数字を0とする
int like_num0=0;
LotoBean1 loto6=new LotoBean1();
loto6.setN_cnt(select_num);
loto6.setLike_num(like_num0);
CalcLotoBean calcloto6=new CalcLotoBean();
calcloto6.execute(loto6);
request.setAttribute("loto6_result", loto6);
RequestDispatcher dispatchar2=request.getRequestDispatcher("loto6_result.jsp");
dispatchar2.forward(request, response);
}
if (request.getParameter("btn_auto2") != null) {
//口数
int select_num=Integer.parseInt(request.getParameter("sel_num2"));
//好きな数
int like_num0=Integer.parseInt(request.getParameter("sel_like_num2"));
LotoBean1 loto6=new LotoBean1();
loto6.setN_cnt(select_num);
loto6.setLike_num(like_num0);
CalcLotoBean calcloto6=new CalcLotoBean();
calcloto6.execute(loto6);
request.setAttribute("loto6_result", loto6);
RequestDispatcher dispatchar2=request.getRequestDispatcher("loto6_result.jsp");
dispatchar2.forward(request, response);
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>口数入力</title>
</head>
<body>
<h1>6桁の数字が自動で出力されるタイプ</h1>
<form action="/loto6/Loto6Servlet" method="post">
<h3>
口数 :
<select name="sel_num">
<option>3</option>
<option>5</option>
<option>7</option>
</select>
<input type="submit" name="btn_auto" value="出力">
<br>
</h3>
<h1>好きな数字を1つだけ選択できるタイプ</h1>
<h3>
口数 :
<select name="sel_num2">
<option>3</option>
<option>5</option>
<option>7</option>
</select>
<br>
くじに入れる数字 :
<select name="sel_like_num2">
<% for(int i=0;i<43;i++){ %>
<option><%= i+1 %></option>
<% } %>
</select>
<input type="submit" name="btn_auto2" value="出力">
</h3>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 下記でモデルを指定するとモデル内のデータを取得できるようになる --%>
<%@ page import ="model.LotoBean1" %>
<% LotoBean1 loto6_r=(LotoBean1) request.getAttribute("loto6_result"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>結果</title>
</head>
<body>
<h1>結果</h1>
<h2>
結果:<br>
<%= loto6_r.getLot6_str() %><br><br>
<a href="/loto6/input_loto.jsp">戻る</a>
</h2>
</body>
</html>
5.実行結果
(1)全自動で7口申し込みしたとき
(2)好きな数字11を選んで5口申し込みしたとき
数字11を含む重複しない5口分の組み合わせが表示。
6.参考url
7.最後に
こういう予測ロジックを入れたら1000万以上の高額当選をされた、
という情報が頂けたら嬉しいです。(笑)
この記事を読んでくれた方も、私も大きく当たりますように。