5.00 / 1 oy

Java'da Sayısal Loto Kazanç Kayıp Simülasyonu Yapmak

Ö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 :)

 

utku33

08.02.2020 04:27

Bu soru henüz yanıtlanmamış.

Bu soruya sadece kayıtlı kullanıcılar yanıt yazabilirler. Yanıt yazmak için lütfen giriş yapınız.

Reitix
Java'da Sayısal Loto Kazanç Kayıp Simülasyonu Yapmak

İnternet sitemizdeki deneyiminizi iyileştirmek için çerezler kullanıyoruz. Bu siteye giriş yaparak çerez kullanımını kabul etmiş sayılıyorsunuz. Daha fazla bilgi.