Merhaba Arkadaşlar,
Eminim bir çoğunuz bir daktilonun tuşlarına rastgele basarak Shakespeare’in tüm eserlerini yazan maymunun hikayesini duymuştur. Daha doğrusu yazma ihtimali olan diyelim. 🙂 Aslında mesele maymun veya başka bir hayvan ile ilgili değil. Bunun sadece olasılık ve sonsuzluk üzerine düşünülesi bir hikaye olduğunu söyleyebiliriz.
Öncelikle bilmeyenler için yazar maymun hakkında biraz konuşalım. Bu düşünce deneyinde bir maymuna bir daktilo verilerek maymundan Shakespeare’in tüm eserlerini yazması istenmektedir. Tabii ki maymun bu isteği anlamadığı için daktilonun tuşlarına rastgele basmaya başlar. Günler haftaları, haftalar ayları, aylar yılları kovalar ve bir gün maymunun yazdıkları kontrol edildiğinde gerçekten Shakespeare’in tüm eserlerini yazdığı görülür. Her ne kadar bu sadece bir düşünce deneyi olsa da teorik olarak belirli şartlarda bu olayın gerçekleşmesi mümkündür. Şimdi gelin bu olayı istatistiksel açıdan inceleyelim.
Bunun için bilmemiz gereken ilk şey birbirinden bağımsız iki olayın birlikte gerçekleşme olasılığının, ayrı ayrı gerçekleşme olasılıklarının çarpımına eşit olduğudur. Yani maymunun daktilonun “a” tuşuna basma olasılığı P_a, “b” tuşuna basma olasılığı P_b ise önce “a” sonra “b” tuşuna basma olasılığı P_aP_b olur. Ancak bu durum olayların bağımsız olması durumunda geçerlidir. Maymunun tuşlara rastgele bastığını düşündüğümüz için bizim senaryomuzda tuşlara basılma durumları birbirinden bağımsızdır. Bu hesabı istediğimiz kadar genişletebiliriz. Örneğin sırasıyla “a”, “l” ve “i” tuşlarına basılma olasılığı P_aP_lP_i olur.
Peki tuşlara basılma olasılığını temsil eden P_x nasıl hesaplanır? Burada tuşlara rastgele basılıyor olması, tüm harflere basılma olasılığının eşit olduğu anlamına gelmektedir. Buna göre daktiloda yazabileceğimiz karakter sayısı bizim durum uzayımızı oluşturmaktadır. Bu sayının N olduğu durumda harflere basılma olasılığı aşağıdaki gibi hesaplanır.
P_x = \frac{1}{N}
Peki daktiloda kaç karakter yazabiliyoruz? Büyük harf, küçük harf, noktalama işaretleri ve özel karakterleri dikkate aldığımızda bu sayı oldukça artmaktadır. Bu nedenle deneme yapmak için yazabileceğimiz karakterleri sadece küçük harflerle sınırlandıralım. Bu durumda İngilizce alfabe için 26 karakterlik bir uzayımız olur ve maymunumuzun rastgele tuşlara basarak “ali” yazma olasılığı aşağıdaki gibi hesaplanır.
P_{ali}= \frac{1}{26}\frac{1}{26}\frac{1}{26} = \left(\frac{1}{26} \right)^3 = 5.69\times 10^{-5}
Burada tek bir harfe basılma olasılığı 1/26’dır. Birbirinden bağımsız 3 harfe basılması gerektiği için durumların olasılıkları birbiriyle çarpılır. Sonuç olarak daktilonun tuşlarına rastgele olarak 10 bin defa basılması durumunda ortaya çıkan metin içerisinde muhtemelen yaklaşık 6 tane “ali” kelimesinin bulunacaktır. Tabii bu tek bir denemede daha az veya daha fazla olabilir ama bu deneyi çok kez tekrarlayıp 10 bin harf içerisindeki “ali” kelimelerinin ortalamasını alırsak 6 sayısına ulaşırız. Ancak harf sayısı arttıkça bu olasılık ciddi oranda değişmektedir. Örneğin “mehmetali” kelimesini rastgele denemelerle bulunabilme olasılığı 500 milyarda 1’dir.
Şimdi bu düşünce deneyini basit bir program ile gerçekleştirebiliriz. Yani maymunun yerine Matlab programını, daktilonun yerine ise bilgisayarımızı koyarak bu düşünce deneyini test edelim.
clear; clc;
alphabet = 'a':'z'; % Alfabe
name = 'ali'; % Aranacak isim
% Isim uzunluğu kadar rastgele harf uretilir
rand_data = alphabet(randi(numel(alphabet), 1, length(name)));
k = length(name); % Rastgele uretilen harf sayisi
while true
if all(rand_data == name)
% Rastgele uretilen harflerin hepsi isim ile aynı ise
% donguyu sonlandır
break;
else
% Aynı degilse rastgele uretilen ilk harfi sil, sona yeni
% bir rastgele harf ekle ve sayiciyi arttir
rand_data(1:end-1) = rand_data(2:end);
rand_data(end) = alphabet(randi(numel(alphabet)));
k = k + 1;
end
end
disp(['Yazar maymun ' num2str(k), ' adet tuşa bastıktan sonra ',...
rand_data, ' kelimesine ulaşmıştır.']);
Yukarıdaki programda genel olarak rastgele harfler üretilmekte ve üretilen bu harfler “ali” ile eşit olana kadar döngü devam etmektedir. Yani maymunumuz “ali” kelimesini bulana kadar rastgele tuşlara basmaktadır. Yaptığım denemelerde bu isime 50 rastgele harf sonucunda ulaştığı zaman da oldu 60 bin harf sonucunda ulaştığı da. Dediğimiz gibi rastgele olduğu için bu bu tamamen şans ile alakalı aslında ama tüm bu denemelerin ortalamasını aldığımızda yaklaşık 10 bin harfte 6 defa (yani 1666 harfte 1 defa) değerine yakın bir değer bulmamız gerekmektedir. İsterseniz bunu programı biraz güncelleyerek test edebilirsiniz. Tabii ki “name” değişkenini değiştirerek kendi isminiz için de programı çalıştırabilirsiniz, ancak dikkatli olun isminiz uzunsa program çok uzun süre çalışacaktır. Örneğin “mehmet” ismini bulması ilk denememde yaklaşık yarım saat sürmüştü. Zaten bundan sonra ikinci defa denemedim. 🙂
Şimdi bu bilgiler ışığında düşünce deneyimizi yeniden inceleyelim. Tahmin edebileceğiniz gibi sadece 9 harfli bir kelime için bile yüz milyarlarca deneme yapmak gerektiğinden dolayı Shakespeare’in tüm eserlerini geçtim sadece tek bir cümlesinin rastgele denemelerle yazılabilmesi için bile olağan üstü sayılarla deneme yapmak gerekir. Örneğin 50 harften oluşan bir cümleyi bu şekilde yazabilme olasılığımız aşağıdaki gibidir.
P_{x}= \left(\frac{1}{26} \right)^{50} = 1.78\times 10^{-71}
On üzeri eksi yetmiş bir. İnanılmaz bir olasılık gerçekten. Bu olasılık o kadar küçük ki pratik uygulamalarda hiç düşünmeden göz ardı edilebilir. Ancak şuan teorik olarak ilerliyoruz değil mi? 🙂 Her ne kadar bu olasılık çok küçük olsa da unutmayın maymunumuza sonsuz deneme hakkı veriyoruz. Tabii maymun o kadar uzun yaşayamayacağı için isterseniz maymunu bir bilgisayarla değiştirelim. Sonuç olarak sonsuzluk karşısında olasılık her ne kadar küçük olursa olsun gerçekleşmeye mahkumdur. Bu aslında pi sayısının içerisinde tüm insanlığın bilgilerinin yer aldığı hikayesi ile aynıdır. Çünkü pi sayısı da sonsuzdur ve uygun bir şekilde ararsanız içerisinde bir yerlerde Shakespeare’in tüm eserlerinin olduğunu görebilirsiniz.
Evet yine uzun bir aradan sonra uzun bir yazı oldu. Aslında bu yazıdan çıkarılabilecek bir düşüncenin de hayallerimizi olabildiğince yüksek tutmak olduğunu düşünüyorum. Bu hayaller he ne kadar imkansız gibi gözükse bile sürekli çalışan güçlü bir iradenin bu hayallere bir gün mutlaka ulaşacağı söylenebilir. O zaman sonraki yazılarda görüşene dek hayallerinizin peşinden koşun efendim. 🙂
Selam Mehmet Ali, tekdüze dağılım (İng. uniform distribution) örnekleri üreten bir fonksiyondan (e.g., MATLAB’da rand()) başka bir dağılım için örnek üretme algoritmasını bir yazında anlatabilir misin? Mesela MATLAB’da exprnd() komutu üstel dağılım (İng. exponential distribution) için örnek üretiyor veya randn() komutu normal dağılım için. Hatırladığım kadarıyla örnek üretmek istediğimiz dağılımın cdf’i kullanılarak yapılabiliyordu.
Merhaba hocam, evet belirli bir pdf’e göre rastgele sayı üretmek için inverse transform sampling yöntemi var ve dediğiniz gibi CDF üzerinden belirli hesaplamalar yapılıyor. Bu konuda daha önce bir örnek yapmamıştım ama konu öneriniz için teşekkür ederim hocam vakit bulduğum bir zamanda bu konu hakkında yazmak isterim. 😊