Rastgele aslında rastgele değildir.
Bu kadar iddialı bir başlığın altını sağlam bir içerik ile doldurmak gerekli tabii ki de. Umarım bu yazının sonunda gerçekten bağlığın vaad ettiği içeriği size sunabilirim. Hemen bağlayalım o zaman ama nereden başlayalım? Önce rastgele nedir’den başlayabiliriz.
Rastgele Nedir ?
Rastgele TDK’nin bu sayfasında şöyle tanımlanmış:
“sıfat Gelişigüzel”
“zarf (ra’stgele) Seçmeden, iyisini kötüsünü ayırmadan, gelişigüzel, lalettayin”
Ya da Rastgelelik hakkında Wikipedia’deki şu paragrafı okuyabilir – pardon okuyamazsınız – Burada ise :
Rastgelelik, olaylarda belirli bir paternin veya öngörülebilirliğin olmama halidir.[1] Rastgele olaylardan, sembollerden ya da adımlardan oluşan bir dizi, herhangi bir mantıksal kombinasyona ya da paterne uyumluluk göstermez. Tekil rastgele olaylar tanımları gereği öngörülemezlerdir. Ancak çoğu durumda, farklı sonuçların oluşum sıklığının çok sayıdaki olaylar kümesine dağılımı tahmin edilebilir. Örneğin, iki zar atıldığında, tekil bir atışın sonucu tahmin edilemezken; toplamda 7 gelmesi, 4 gelmesinden iki kat daha sık olacaktır. Bu açıdan bakıldığında rastgelelik, tesadüften ziyade bir sonucun belirsizliğinin ölçümüdür ve de olasılık, bilgi entropisi ve şans kavramlarında uygulanır.
Bu açıklamalar bize düzensiz, önceden kestirilemeyen (bu konuya yazının devamında değineceğim) ve tamamen şansa bağlı olarak görünmekte. Peki gerçekten böyle mi? En azından günlük hayatta kullandığımız rastgelelikler…
Yazılımda Rastgelelik
Hemen hemen her gün, yazılımsal olarak oluşturulan en az 1 rastgelelik ile karşılaşıyoruz. Bu bir rastgele sayı olabilir, rastgele seçilmiş bir ögenin bize gösterilmesi olabilir veya şans olarak yorumladığımız herhangi bir şey olabilir. Ama gerçekte rastgele var mıdır? Evrende bile hiçbir şey rastgele değilken, insanoğlunun icat etmiş olduğu 2’lik sayı sistemiyle çalışan bir makinede nasıl rastgelelik olabilir ki? Yazılımla biraz uğraşan arkadaşlar bilecektir ki 2 farklı random instance’ından üretilen rastgele sayıların birbiri ile aynıdır. Şöyle örnek verelim:
Random random2 = new Random();
private void GenerageRandom()
{
Console.WriteLine(random1.Next(int.MinValue,int.MaxValue));
}
Bu şekilde 2 farklı random’dan ürettiğimiz sayılar aynı çıkacaktır. Evet bu çok da tatmin edici gelmedi. Bunu şöyle değiştirerek inceleyelim.
Console.WriteLine(random2.Next(0,10000));
Burada da şuna benzer bir sonuç elde etmiş olacağız:
1.Denemede;
random1 = 16 | random2 = 1637
2.Denemede ise
random1 = 55 | random2 =5573
gibi birbiri ile alakasını görebileceğimiz sonuçlar elde etmiş oluyoruz. Veya şu şekilde deneyerek de almış olduğumuz sayıların verdiğimiz üst limete göre oranını da görebiliriz:
Console.WriteLine(random2.Next(0,200));
Bir kaç denemede 10 ve 20 sonuçlarını elde ettim. 10 sayısı vermiş olduğum üst limitin(100) onda biri yani yüzde 10’una takabül etmekte. 20 sayısı ise vermiş olduğum üst limitin(200) onda birine yani birinci gibi %10’una denk geliyor. Yavaş yavaş işlerin gerçek bir rastgeleden ibaret olmadığını göstermeye başlıyor.
Bu işi biraz daha garipleştirerek bir Form uygulamasında şunu yapabiliriz.
Butona her basığımızda rastgele bir sayı oluşturması için buttonun altında MessageBox.Show(random2.Next(0, 100).ToString()); kodunu yazdık. Daha sonra da runtime’da oluşacak olan ilk 100 sayıyı da önceden görebilmemiz için listbox’a sırayla hepsini ekledik.
Artık listbox’da yazan sayılar, butona her bastığımda sırayla gelecek.
Bu da bize Random’un bir algoritma ile oluşturulduğunu gösterir. Zaten yazının en başında da rastgeleliğin şanstan veya tesadüften oluşmadığına ithafen bir göndermede bulunmuştum.
Peki bu sonuç akıllarda bir soru işareti oluşturmuyor mu? Herhangi bir yerde ve zamanda oluşturulan rastgele sayı önceden tahmin edilebilir mi? Bu soruyu yanıtlamak için biraz önce yaptığımız uygulamayı durdurup yeniden çalıştırabiliriz. Tamamıyla farklı sayılar karşımıza gelecektir. Yani aslında bir uygulamanın yaşam döngüsü içerisinde gelebilecek tüm rastgele sayılar uygulama ilk çalıştırıldığında belirlenmiş gibi gözüküyor. Evet aslında buna benzer bir şekilde gerçekleşiyor olaylar. Kulağa oldukça korkunç gelmeye başlamadan önce asıl soruyu soralım? Peki ya şans oyunları? veya bazı oyunlarda var olan şans faktörleri? Belirli bir yüzde ile kazanma şansı gibi pek çok ihtimaller dijital ortamda oluşturuluyor. Peki ya bu sayılar önceden kestirilebilir mi? Bu sayıları önceden kestirmek tabii ki mümkündür. Fakat bunun için gerçekten çok şanslı olmalısınız. Çünkü gerçek anlamda bu sayıları önceden bilmek imkansız gibi görünüyor. (Mümkün ama biz ona yine de bu şartlar altında imkansız diyelim) Çünkü rastgele oluşturmak için bir algoritma kullanmaktayız. Tahmin etmeye çalıştığınız rastgelelik nasıl bir algoritma ile üretiliyor ve üretildikten sonra ne baz alınarak yüzdelik hesaplanıyor. Örnek vermek gerekirse Yüzde 20’lik bir ihtimali hesaplamak için 1 ile 5 arasında bir sayı üretip bu sayının 1 gelme olasılığı veya 2 gelme olasılığı 3,4, veya 5 gelme olasılığı kontrol edilebilir. Sadece bu örnekte bile ihtimal 5 farklı ihtimali daha doğurdu. Yüzde 20’lik bir ihtimali hesaplamanın 1 – 100 arasında bir sayı üretilip bu sayının 20’den küçük olması veya 80’den büyük olması gibi veya 20 – 40 arasında olmasına bakılması gibi pek çok ihtimale bakılıyor olabilir.
Bunu bile kestirmesi imkansız gözüküyorken rastgele sayı oluşturmak için aktif olarak kullanılan Subtractive algoritmesını eğer custom seed kullanılmıyor ise tahmin etmesi gerçekten imkansız gözüküyor.
Algoritma ise bilimsel olarak
şeklinde oluşturuluyor. Bu formulü baz alınarak bir çok dile uyarlanan random algoritması beni asıl ilgilendiren şekilde yani C#dilinde şu şekilde yazılıyor:
Tabi random’un bilimsel olarak oluşturulması ile ilgili daha fazla detay öğrenmek istiyorsanız buraya göz atabilirsiniz.