Java Soru Çözümü-Engel Yöntemi ile Random Sayı Oluşturmak

Merhaba arkadaşlar bugün yine javada bir soruyu çözeceğiz.Sorumuz şöyle:

Soru:Hileli bir para atıldığında 0.7 olasılıkla yazı,o.3 olasılıkla tura gelmektedir.Paranın bu olasılıklarda geleceği bir program yazınız(Hazır random fonksiyonları kullanılmayacaktır)

 

Ben soruyu çözerken random sayı üretmek için engel yöntemini kullandım.Engel yöntemi şöyle;

1.[0,1] aralığında bir  s sayısı belirlenir.

  • uN = s
  • u(N+1)= (uN+PI) ^8  ,0<uN<1
  • uN1 = uN1 in küsüratlı kısmı

 

Örneğin s=.0.1356 olsun,uN=0.1356, uN1=13305.027640762146 olur.Biz bunun küsüratlı kısmını alırsak uN1=0.027640762146 olur..Aynı şekil rastgele sayı üretmek istersek artık uN=0.027640762146 olur ve bunun için uN2=0.328930585585 olarak hesaplanıp devam eder..Gördüğünüz gibi burda random değer oluştururken hep bir önceki değere bağlı şekilde gidiliyor..Biz bunları javada metot haline getirirsek aşağıdaki gibi bir şey çıkıyor.Bir döngü kurup 10 defa rastgele sayı üretelim;


public class Engel_Yontemi {

static double uN = 0.1356;
static double uN1;

public static void main(String[] args) {

for (int i = 0; i < 10; i++) {
getRandom();
}

}

public static double getRandom() {
uN1 = Math.pow((uN + Math.PI), 8);

int indexNokta = (uN1 + "").indexOf(".");
int indexE = (uN1 + "").indexOf("E");
if (indexE < 0) {
indexE = (uN1 + "").length();
}
uN1 = Double.parseDouble("0" + (uN1 + "").substring(indexNokta, indexE));
System.out.println(uN1);
uN = uN1;

return uN1;
}

}

Çıktı:

run:
0.027640762146
0.328930585585
0.519704805167
0.897300711782
0.73410926816
0.9823386789
0.90337782317
0.59804063731
0.06155218886
0.858975547237
BUILD SUCCESSFUL (total time: 0 seconds)

Gördüğünüz gibi oluşan random değerleri kabul edilebilir şekilde dağılmış.Şimdi bu olasılıklara göre sorumuzu çözelim.Burda Para adında bir enum tanımladım ve üretilen random değer 0.7 den küçükse yazi,değilse tura atadım.Fakat şöyle bir sorunumuz var,bu döngü her çalıştığında aynı olasılığı verecek..Yani belirli bir döngüye sokmadan rastgele gibi durmuyor.. Yine de sorunun çözümü sayılabilir..


public class Engel_Yontemi {

static double uN = 0.1356;
static double uN1;

public enum Para {
Yazı,
Tura
}

public static void main(String[] args) {
Para para;
//  for (int i = 0; i < 10; i++) {
double olasilik = getRandom();
if (olasilik < 0.7) {
para = Para.Yazı;
} else {
para = Para.Tura;
}
System.out.println("Para :" + para);
//}

}

public static double getRandom() {
uN1 = Math.pow((uN + Math.PI), 8);

int indexNokta = (uN1 + "").indexOf(".");
int indexE = (uN1 + "").indexOf("E");
if (indexE < 0) {
indexE = (uN1 + "").length();
}
uN1 = Double.parseDouble("0" + (uN1 + "").substring(indexNokta, indexE));
System.out.println(uN1);
uN = uN1;

return uN1;
}

}

Biz algoritmayı biraz düzenleyip seed,yani çekirdek değeri sürekli sistem saatine göre vererek her seferinde aynı sonucu üretmemesini sağlıyoruz..System saatini almak için System.currentTimeMllis() fonksiyonunu kullandık.Bu fonksiyon o anki saati mili saniye cinsinden veriyor bize.Biz de seed değerimizi bu sayinin son 5 hanesi yaptık her seferinde..


public class Engel_Yontemi {

static double uN = 0.1356;
static double uN1;

public enum Para {
Yazı,
Tura
}

public static void main(String[] args) {
Para para;
//  for (int i = 0; i < 10; i++) {
double olasilik = getRandom();
if (olasilik < 0.7) {
para = Para.Yazı;
} else {
para = Para.Tura;
}
System.out.println("Para :" + para);
System.out.println("Saat:" + System.currentTimeMillis());
//}

}

public static double getRandom() {
int timeLenght = ("" + System.currentTimeMillis()).length();
uN = Double.parseDouble("0." + (System.currentTimeMillis() + "").substring(timeLenght - 5, timeLenght-1));

uN1 = Math.pow((uN + Math.PI), 8);

int indexNokta = (uN1 + "").indexOf(".");
int indexE = (uN1 + "").indexOf("E");
if (indexE < 0) {
indexE = (uN1 + "").length();
}
uN1 = Double.parseDouble("0" + (uN1 + "").substring(indexNokta, indexE));
System.out.println(uN1);
uN = uN1;

return uN1;
}

}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir