Önceki iki paylaşımımda önce Java'da sayısal loto ile çekiliş yaptık, sonra da manuel bir kupon doldurarak kaç tutturduğumuzu kontrol ettik. Şimdi sistem tarafından otomatik olarak 1000 adet kupon dolduralım ve kaç kuponun 6 tutturduğunu ya da tutturamadığını kontrol edelim. Hatta daha da ileri giderek kaç kuponun 5, 4 ve 3 tutturduğuna da bakalım ve güncel ücretler ve ikramiyeler ile kazanç/kayıp durumlarını inceleyelim. 1000 tane kuponu elle dolduramayacağımıza göre kupon doldurma işlemini de sisteme yaptıralım.
Not 1: Çekiliş yapan ve kupon dolduran iki metodun da çalışma mantığı birebir aynıdır, sadece daha anlaşılır olsun diye bu şekilde iki farklı metod kullandım.
Not 2: Kaç adet tutturduğum (0, 1, 2, 3, 4, 5, 6) kuponların sayısını da sonuçlar isminde bir vektörde sakladım. Bu vektörün amacı sadece frekansları tutmaktır.
Kodlar: Önce 1000 tane otomatik kupon doldurarak sonuçları önden bir görelim:
public static void main(String [] args) {
int[] sonuclar = {0, 0, 0, 0, 0, 0, 0};
//çekiliş yapalım
int[] cekilis = cekilisYap();
//1000 adet kuponumuzu dolduralım ve
//kaç adet tuturduğumuzu kontrol edelim
for (int i=1; i<=1000; i++)
{
int[] kupon = kuponDoldur();
int tutturmaSayisi = tutturmaSayisiKontrol(cekilis, kupon);
sonuclar[tutturmaSayisi]++;
}
//sonuçlar
for (int i=0; i<=6; i++)
{
System.out.println(i + " tane tutan kupon sayısı="+sonuclar[i]);
}
}
public static int topCek()
{
return (int)(Math.random()*49)+1;
}
public static int[] cekilisYap()
{
int[] cekilis = new int[6];
for (int i=0; i<6; i++)
{
boolean kontrol=true;
while (kontrol)
{
int top=topCek();
kontrol = IntStream.of(cekilis).anyMatch(x -> x == top);
if(!kontrol)
cekilis[i]=top;
}
}
Arrays.sort(cekilis);
return cekilis;
}
public static int[] kuponDoldur()
{
int[] kupon = new int[6];
for (int i=0; i<6; i++)
{
boolean kontrol=true;
while (kontrol)
{
int top=topCek();
kontrol = IntStream.of(kupon).anyMatch(x -> x == top);
if(!kontrol)
kupon[i]=top;
}
}
Arrays.sort(kupon);
return kupon;
}
public static int tutturmaSayisiKontrol (int[] cekilis, int[] kupon)
{
int sayac=0;
for (int i=0; i<cekilis.length; i++)
{
for (int j=0; j<kupon.length; j++)
{
if (cekilis[i]==kupon[j])
sayac++;
}
}
return sayac;
}
Sonuçlar (Çıktı):
0 tane tutan kupon sayısı=447
1 tane tutan kupon sayısı=434
2 tane tutan kupon sayısı=104
3 tane tutan kupon sayısı=14
4 tane tutan kupon sayısı=1
5 tane tutan kupon sayısı=0
6 tane tutan kupon sayısı=0
1 tane kupon doldurunca bile 6 adet tutma hayalleri kuruyoruz, 1000 adet kupon doldurunca en azından birisi 6 tutar diye bekliyordunuz değil mi? Ama 5 tutturduğumuz bile yok. Şimdi örneği bir aşama daha ileri taşıyarak deneme sayısını 100.000 yapıyorum ve güncel ikramiye tutarları üzerinden kar/zarar hesabı da yapıyorum: (5 Şubat 2020 tarihi verileri dikkate alınmıştır)
Kolon bedeli: 1,5 TL
3 tutturma ikramiyesi: 13,95 TL
4 tutturma ikramiyesi: 104,40 TL
5 tutturma ikramiyesi: 6.828,90 TL
6 tutturma ikramiyesi: 3.209.626,78 TL
Kodlar:
public static void main(String [] args) {
int[] sonuclar = {0, 0, 0, 0, 0, 0, 0};
int denemesayisi=100000;
double maliyet=denemesayisi*1.5;
double[] ikramiyeler= {0, 0, 0, 13.95, 104.40, 6828.90, 3209626.78 };
System.out.println("Kupon sayısı:"+denemesayisi);
//çekiliş yapalım
int[] cekilis = cekilisYap();
//1000 adet kuponumuzu dolduralım ve
//kaç adet tuturduğumuzu kontrol edelim
for (int i=1; i<=denemesayisi; i++)
{
int[] kupon = kuponDoldur();
int tutturmaSayisi = tutturmaSayisiKontrol(cekilis, kupon);
sonuclar[tutturmaSayisi]++;
}
//sonuçlar
double kazanc=0;
for (int i=0; i<=6; i++)
{
System.out.println(i + " tane tutan kupon sayısı="+sonuclar[i]);
kazanc+=ikramiyeler[i]*sonuclar[i];
}
System.out.println("toplam maliyet="+maliyet+" TL");
System.out.println("toplam kazanç="+kazanc+" TL");
System.out.println("kar-zarar durumu="+(kazanc-maliyet)+" TL");
}
public static int topCek()
{
return (int)(Math.random()*49)+1;
}
public static int[] cekilisYap()
{
int[] cekilis = new int[6];
for (int i=0; i<6; i++)
{
boolean kontrol=true;
while (kontrol)
{
int top=topCek();
kontrol = IntStream.of(cekilis).anyMatch(x -> x == top);
if(!kontrol)
cekilis[i]=top;
}
}
Arrays.sort(cekilis);
return cekilis;
}
public static int[] kuponDoldur()
{
int[] kupon = new int[6];
for (int i=0; i<6; i++)
{
boolean kontrol=true;
while (kontrol)
{
int top=topCek();
kontrol = IntStream.of(kupon).anyMatch(x -> x == top);
if(!kontrol)
kupon[i]=top;
}
}
Arrays.sort(kupon);
return kupon;
}
public static int tutturmaSayisiKontrol (int[] cekilis, int[] kupon)
{
int sayac=0;
for (int i=0; i<cekilis.length; i++)
{
for (int j=0; j<kupon.length; j++)
{
if (cekilis[i]==kupon[j])
sayac++;
}
}
return sayac;
}
Çıktı (Sonuçlar): 100.000 Deneme için
Kupon sayısı:100000
0 tane tutan kupon sayısı=43777
1 tane tutan kupon sayısı=41376
2 tane tutan kupon sayısı=13047
3 tane tutan kupon sayısı=1700
4 tane tutan kupon sayısı=95
5 tane tutan kupon sayısı=5
6 tane tutan kupon sayısı=0
toplam maliyet=150000.0 TL
toplam kazanç=67777.5 TL
kar-zarar durumu=-82222.5 TL
Çıktı (Sonuçlar): 1.000.000 (1 milyon) Deneme için
Kupon sayısı:1000000
0 tane tutan kupon sayısı=436343
1 tane tutan kupon sayısı=412853
2 tane tutan kupon sayısı=132146
3 tane tutan kupon sayısı=17653
4 tane tutan kupon sayısı=988
5 tane tutan kupon sayısı=17
6 tane tutan kupon sayısı=0
toplam maliyet=1500000.0 TL
toplam kazanç=465497.85 TL
kar-zarar durumu=-1034502.15 TL
Sonuçlar yorumlamaya değmeyecek kadar ortada. Ancak bu işlemin bir simülasyon olabilmesi için çekiliş sayısının da binlerce kez tekrarlanması gerektiğini söylemek istiyorum, şu an sadece binlerce ya da milyonlarca kupon doldurma örneği yapmış olduk. Yarın da 6 tutturuncaya kadar sayısal loto çekilişi yapan bir program yazarak kaç adet deneme yapmamız gerektiğini tartışırız :)