J2ME’de Rastgele Sayı ve Yazı Üretme

____________________________________________________________________

Bir ara bilgisayarda nasıl rastgele sayılar üretildiğini merak ediyordum. Örneğin; Winamp nasıl şarkı listesindeki şarkıları rastgele sırayla çalabiliyordu. Biz insanlar belli iki sayı arasında rastgele bir sayı seçmek istediğimize ortadaki sayıdan büyük olsun, ama en büyük sayıdan küçük olsun şeklinde mantık yürütürüz. Fakat bilgisayarlar bunu nasıl yapıyordu. Bir sayı belirlenirse bu sayı üzerinde çeşitli matematiksel işlemler yaparak farklı bir sayı üretebilirdik ama hiç birşeyi değiştirmeden ürettiğimiz sayı da aynı olacağına göre demek ki işlem yapacağımız sayının da değişmesi lazımdı. Ama bunu yapabilmek zaten rastgele bir sayı oluşturabilmek demekti. Bir süre bunu düşünmüş kafamda saçma sapan fikirler üretmiştim, taaki doğru cevabı bir dergide bulana kadar.

Bir gün ’nin kütüphanesinde güncel bilgisayar dergilerini inceliyordum. Adını tam olarak hatırlayamıyorum ama sanırım PC World dergisi idi, içinde programlama ile ilgili her sayısında bazı yazılar çıkardı. Bu seferki yazısı da şansıma rastgele sayı üretmekmiş. 😀 Hemen merakla yazıyı okumaya başladım, tarihteki rastgele sayı üretme metodlarıyla ilgili fikirlerden vs. bahsediyordu başlarda. Asıl bombayı sona saklamışlar. Tabi benim için hayal kırıklığına uğratıcı bir bomba oldu. 🙁 Rastgele sayıyı üretmek için bir çekirdek sayısı belirlenip bu sayı üzerinde çeşitli matematiksel işlemler yapılarak belirlediğimiz sınırlarda bir rastgele sayı üretileiliyordu. Peki çekirdek sayı nasıl belirleniyordu, bu sayı neydi? İşte burası bomba, sistem saati, yani zaman. 😀 Zaman bildiğiniz gibi devamlı değişiyor ve devamlı olarak artıyordu. Yani zamanı milisaniye cinsinden alıp üzerinde işlemler yaparak bir rastgele sayı üretebiliyordunuz.

Bir ara bir J2ME uygulamasımda rastgele bir metin ürettirmem gerekti. Bunu önce bir sayı üretip bunun ile de bir yazı seçerek yaptım.

Rastgele metin oluşturma işlemini önce rastgele sayı üreterek yaptım (Daha farklı yöntemlerle de yapılabilir ama benim kullanmam gereken sınır dar olduğu için uğraşmak istemedim.). J2ME’de J2SE ve J2EE’de olduğu gibi rastgele sayı üretimi için Math.Random sınıfı yoktur. J2ME’de bu işe java.util.Random ile yapılır. Öncelikle bu sınıfın kullanılacağını import komutu ile belirtmeliyiz. Bunun kaynak dosyamızın başına;
import java.util.Random;
yazarak yaparız. Daha sonra da uygulamada rastgele metnin gerekli olduğu yere göre bir metod yazarız. Benim kullandığım metod doğrudan String döndürüyor.
İlk önce Random sınıfını başlatıp buna bir çekirdek sayısı değeri atıyoruz. Bunu setSeed() yöntemi ile yapıyoruz. Tabi milisaniye cinsinden sistem saatini de bu yönteme System.CurrentTimeMillis() yöntemiyle veriyoruz. Daha sonra da rastgele bir sayının oluşturulmasını sağlayan bir yöntem kullanıyoruz. Bu uygulamayı yazdığımız MIDP versiyonuna göre veya istediğimiz veri türüne göre değişmekle birlikte Random sınıfına nextInt(), nextLong(), nextFloat() gibi yöntemlerle rastgele sayımızı belirlediğimiz sınırlar arasında oluşturuyoruz. Ben aşağıdaki gibi bir String oluşturmayı seçtim. Yani RastgeleYazi() çağrıldığında rastgele bir yazı dönecek.

public String RastgeleYazi()
{
String rastgeleYazi=null;//Bir String oluşturuyor ve başlatıyoruz
Random generator = new Random(); // Burada rastgele sınıfımızı başlatıyoruz
generator.setSeed(System.currentTimeMillis());//Rastgele sayı üretimi için sistem saatini çekirdek olarak atıyoruz
int sayi = 0 + generator.nextInt() % 5;//Burası ile de 0 ve 5 arasında rastgele bir sayı üretiyoruz. Sayının 0'dan büyük ve 5'dan küçük olduğunu belirtiyoruz.
//Aşağıdaki anahtarda da üretilen rastgele sayıya göre listemizdeki yazılardan birini seçeceğiz.

switch(sayi)
{//Burada rastgele üretilen sayı kaç ise onun karşılığındaki kısımda rastgeleYazi referansına isteidğimiz metin atanıyor.
case -5:rastgeleYazi = "Ye ya da yem ol!";break;
case -4:rastgeleYazi = "Dünya bir tuzaktır, tanesi de arzulardır. Mevlana";break;
case -3:rastgeleYazi = "Venedik’i gör, sonra öl.";break;
case -2:rastgeleYazi = "Tehdit eden kişi öldürür de!";break;
case -1:rastgeleYazi = "Ağız ayakları taşır.";break;
case 0:rastgeleYazi = "Kesici aletlerin en keskini dildir.";break;
case 1:rastgeleYazi = "Ot olursan, keçiler bile seni yer.";break;
case 2:rastgeleYazi = "Eşek bile düştüğü yere tekrar düşmez.";break;
case 3:rastgeleYazi = "İktidar gizlemesini bilene aittir.";break;
case 4:rastgeleYazi = "Irmağı temiz su taşırmaz.";break;
case 5:rastgeleYazi = "Tercüman demek hain demektir.";break;
}
return rastgeleYazi;//RastgeleYazi() çağırıldığında rastgeleYazı'nın dönmesi sağlanıyor
}
Bundan böyle uygulamamızda gereken yerde RastgeleYazi() yöntemini çağırarak rastgele bir yazı yazdırabiliyoruz. Yani önce bir rastgele sayı oluşturuyor ve sonra bunu kullanarak bir rastgele yazı seçiyoruz. Burada daha farklı yöntemlerde kullanılabilirdi fakat benim uygulamama yeterli olduğu için fazlasına gerek duymadım. Özellikle rastgele üretilen sayı ile bir yazının alınması kısmında daha fazla olasılığın olduğu durumlarda alınacak yazı ayrı bir dosyaya alınabilir ve rastgele üretilen sayı örneğin belirli bir satırı almak için kullanılabilir.

Bu şekilde java.util.Random sınıfı ile cep telefonumuzdaki bir uygulama için basit bir şekilde önce bir rastgele sayı üretebilir ve bu sayıyı bir yazıya çevirebilir eğer bu yazı örneğin bir resmin yolu olursa rastgele resimler gösterebilir veya aynı Winamp’taki gibi bir şarkı listesinde rastgele bir şarkı seçebiliriz.