Rastgele mi? Ne kadar?
Bazen, kurduğumuz algoritmanın bir yerinde rastgele bir işlem yapmamız gerekir. Rastgele bir resim göstermek veya bir yazı yazdırmak isteyebileceğimiz gibi; önemli bir veriyi şifrelemek için rastgele bir anahtara ihtiyaç duyabiliriz.
Programlama dillerinde kullanılan “rastgele” kavramı, günlük hayatımızda kullandığımız kadar basit değildir. Bir kere, bir programlama diline “Rastgele bir sayı üret” diyemeyiz, çünkü kod içindeki her değer, bir işlem sonucunda belirlenmek durumundadır. Bu sebeple programlamada rastgele değer üretmek dediğimiz zaman, aslında rastgeleye yakın sonuçlar üretmeyi kastederiz.
Peki rastgele deyince neyi anlamalıyız? Olasılık hesaplamalarını hatırlarsınız. “İçinde 9 tane kırmızı ve 1 tane mavi olmak üzere 10 top bulunan bir kutudan mavi topun seçilme ihtimali nedir?” tarzı olasılık soruları, belki havuz problemleri kadar sık karşılaşılan sorulardır öğretim hayatımızda.
Olasılık konusunun temel dayanağı, rastgele seçim yapabilme durumudur. Olasılık hesaplarına göre, elimizde biri kırmızı, biri mavi olmak üzere 2 top varsa, bir seçimde mavinin gelme ihtimali 1/2‘dir. Başka bir değişle, bu 2 top arasında 100 kere rastgele seçim yapsak; 50 kere mavi top, 50 kere kırmızı top gelmelidir. (*)
İşte rastgele seçimden kasıt budur: Olasılık hesaplarına tam olarak uyan bir seçim yapabilme.
Fakat bildiğiniz gibi, günlük hayatta 2 top arasında 100 kere seçim yapmayı denesek, iki rengi de eşit sayıda tutturmamız pek mümkün değildir. 60’a 40, 30’a 70 gibi değerlerle daha sık karşılaşırız.
Pratik hayatımıza yansıyan bu acaip durumlar, olasılık hesaplarıyla uğraşanları pek ilgilendirmezler. Çünkü olasılık hesaplarıyla uğraşanlar, bu durum kendilerine söylendiğinde, tam olarak rastgele yapılacak bir seçimden bahis açar, sözü yaptığımız seçim dizisinin hatalı olduğuna getirirler. Hani haksız da sayılmazlar.
Çünkü 2 top arasında yaptığımız tercih, hangi elle seçim yaptığımızdan, o anki ruh halimize; -eğer renklerini görebiliyorsak- hangi rengi daha çok beğendiğimizden, “sonucun ne çıkmasını istediğimize” kadar yığınla faktörden etkilenir.
Haliyle bu seçim, rastgele olmaktan çok uzaktır ve olasılık hesapları kapsamından çıkar.
Ama bu durumu genelde çok da önemsemeyiz. Bir şifre belirlememiz istendiğinde hiç duraksamadan şifreler üretir, bir dolaptan meyvesuyu almamız gerektiğinde hızlıca ilk gördüğümüzü alırız. Çünkü gerçek hayatta, rastgele seçim yapmamız gereken durumlar, kararsız kaldığımız durumlardır ve önceliğimiz herhangi bir tercih yapmaktır.
İş ciddileştiğinde, önemli bir tercih yapılacağında; rastgele seçim yapma hakkını insanlardan alır, bilgisayarlara veririz.
Onların rastgele tercihler yapacağına daha çok güveniriz. Hatta çoğumuz, onların gerçekten rastgele sonuçlar üretebildiklerine inanırız.
Fakat üretemezler.
Bilgisayar programları, değişik fonksiyonlar kullanarak rastgeleye yakın değerler üretmeye çalışırlar. Fakat elde edilen sonuçlar, olasılık kurallarına genelde pek yaklaşmazlar.
Bir örnekle açıklamamız gerekirse, 10 kişi arasından 100 kere tercih yapacak bir bilgisayar programı; rastgele seçim yapabilirse, her kişiyi 10’ar kere seçecektir.
Peki kullandığımız rastgele seçim yapan fonksiyonlarda sonuç böyle olur mu? Olmaz.
A kişisi 15 kere seçilirken, B kişisi 5 kere seçilebilir. Kullanılan fonksiyonun ne kadar başarılı olduğuna bağlı olarak değişecek miktarlarda, doğru değerden sapmalar meydana gelir.
Hatta fonksiyonların kullandıkları formüller incelenebilirse, bir seçimde hangi sonucun çıkacağı da kestirilebilir.
Bu sebeple rastgele sonuçlar üreten fonksiyonlar, genelde formüllerini gizli tutarlar.
İsterseniz burada, programlama dillerinden PHP’deki rastgele sayı üretme fonksiyonlarına değinelim:
PHP’de rastgele değer üretmek için 2 bütünleşik fonksiyon kullanılabilir: rand () ve mt_rand (). Rand, hızlı sonuç verir, fakat zayıftır. mt_rand ise benzerlerine göre güçlüdür ve standart bir rastgele sayı üretecinden 4 kat hızlı çalışır. Yine de iki fonksiyonun da ürettikleri değerlere “pseudo-random” (yalancı rastgele) değerler denir. Çünkü verdikleri sonuçlar, açık konuşmak gerekirse, rastgele olabilmekten çok uzaktırlar.
Rand fonksiyonu libc isimli oldukça zayıf bir rastgele sayı üretecini kullanır. Zayıf olmasının ne gibi bir sıkıntı oluşturabileceğini düşünenlerdenseniz, hemen açıklayalım.
3 karşılama cümlesinden birisini seçerek ekrana yazdırmak istediğinizde, seçilen sayının rastgele’ye ne kadar yakın olacağının pek bir önemi yoktur. Bu durumu yukarıdaki buzdolabından meyvesuyu seçme durumuna benzetebiliriz. Amacınız, her açılışta bu cümlelerden birinin yazmasıdır sadece.
Fakat işlemler biraz ciddiye bindiğinde; örneğin 1000 üyeli bir online oyunda, rastgele bazı oyunculara ek puanlar verileceğinde, bu puanların hangi üyelere denk geleceği önem kazanır. Bir üye 2 kere puan kazanabilir belki ama, “Rastgele seçim yaptık” dediğimiz bir oyunda, aynı oyuncuya 10 kere puan verilmesini istemeyiz. Böyle bir durumda, rand fonksiyonundan daha başarılı bir fonksiyon kullanmamız gerekir. İşte mt_rand böyle durumlarda işimize daha çok yarar.
mt_rand fonksiyonu, adının ilk 2 harfini aldığı Mersenne Twister‘dan yararlanarak rastgele sayılar üretir.
2 fonksiyon da çalışabilmek için seed (besleme) bir sayı değerine ihtiyaç duyarlar. Bu değerler, kullanılan fonksiyonlar için ciddi bir öneme sahiptir. Çünkü seed olarak aynı değer seçilerek yapılacak secimlerde, çıkabilecek sayılardan oluşan dizi de hep aynı olacaktır.
Neyse ki; rand da, mt_rand da, başka bir değer seçilmezse, formüllerinde kullanmak üzere microtime değerlerinden yararlanırlar. Her an için, microtime değerleri birbirinden farklı olduğundan, fonksiyonun verebileceği sayı dizisi de sürekli değişir.
Bir daha yanınızda bilgisayarda rastgele seçimden bahsedilirse, sonucun “ne kadar rastgele” olduğunu sormayı deneyin.
Muhtemelen karşınızdakiler garip garip bakarak, sorunuzu anlamaya çalışacaklar.
Ne de olsa bilgisayarlar, hep olasılık hesabına uygun rastgele seçimler yaparlar!
İnsanlar mı? Onlara güven olmaz!
Yazılım dünyasında sancısının çok yaşandığı bir konuya değinmişsiniz.
Fakat verdiğiniz örnekte malesef bir hata var.
Her seçim sadece kendi içinde 1/2 olasılığına sahiptir. Siz 100 seçim yaptığınızda 50 mavi,50 kırmızı gelme olasılığı ile 1 mavi 99 kırmızı gelme olasılığı birbirine eşittir. Çünkü her seçim bir öncekine göre bağımsızdır ve onun ne geldiğini bilmez.
Merhaba,
Haklısınız.
Orada geçen önerme, yazının bir kaç yerinde daha geçiyor. Fakat yalnızca bu önermede bir sıkıntı var, çünkü diğer önermelerde bilgisayardaki olasılık kavramından bahsediliyor.
Aslında böyle bir yazıyı hazırlarken tam olarak matematik kurallarına uygun yazmakta zorlanacağımı biliyordum. Çünkü konu, bazı bölümlerinde klasik olasılık hesaplarının biraz dışına çıkıyor. Pek çok insan, bir seçime ideal diyebilmek için örneğin 100 seçimde 50-50 gibi bir dağılım olmasını bekliyor ve ancak böyle bir sonuç dizisinde, yeterince rastlantısal seçimler yapılmış olabileceğini kabul ediyor.
Aynı şekilde pseudo-randomness kavramı da, “istatistiksel olarak raslantıya yakın oranda sonuçlar döndürebilen algoritmalar”dan bahsediyor.
Bahsettiğiniz önerme, gerçekten de matematik açısından düşünüldüğünde yanlış. Fakat pratik hayatımızda rastlantı denildiği zaman, genelde böyle, istatistiksel olarak rastlantıya uyan bir durumu bekliyoruz.
Olasılık hesaplamaları, böyle bir kuralın olmadığını, her seçimin kendi içinde değerlendirilmesi gerektiğini söylüyor. Bu sebeple burada verdiğimiz örnek, yalnızca yalancı rastgelelik ile rastgelelik arasında bir benzetme düzeyinde işe yarayabilir.
Yazıda cümlenin geçtiği yere, bu yoruma giden bir ekleme yaptık. Sanırım verdiğimiz örneklerin temelini bu şekilde açıklayabiliriz.
Bir yazılımcı olarak yazınızın örnekler dışındaki kısmına tamamen katıldığım için bir ekleme yapmadım 🙂
Fakat rastlantı konusunda yine bir konuda karmaşa var
Gerçek hayatta beklentimiz 2 tane olasılığın sırayla gerçekleşmesi olmamaz. Çünkü o zaman rastlantısal bir durum söz edemeyiz. Bir zar attığınızda 36 olasılık da sırayla gerçekleşmez bazen peşpeşe birkaç defa 6,6 da atabilirsiniz, bazen de hiç atmayabiliriz. Yazılımda da aynı şekilde bir kümenin içindeki sayıların rastlantısal olarak gelebilmesi için bazen tekrar ediyor olmaları bazen bir sayının diğerlerinden daha fazla geliyor olması çok normal olmalı. yoksa her sayının sırayla (farklı sıralarda dahi olsa) ve eşit sayıda geliyor oluşu bir rastlantı değildir.
Bu arada aklıma gelen bir rastgele sayı bulma yöntemi de PI sayısının basamaklarının kullanımı. Bildirgeçteki bu yazıda da görüldüğü gibi tirilyonlarca basamağı çözülerek bu basamaklar rastgele sayı üretgeçleri için kullanılıyor. Malum PI sayısındaki rakamlar kesinlikle belli bir kurala göre gitmiyor. Bu açıdan rasgele sayılar için güzel bir kaynak
Aslında karmaşa yok. Bir seçim dizisinde sayılar sırayla çıkmalı veya hepsi çıkmalı demiyorum. Hedeflediğimiz değerde, örneğin 1000 çekimde, istatistiksel olarak tam yaygın bir dağılım düşürebilen bir fonksiyon ürettiğimiz zaman, bu fonksiyon, o konuda tam rastgele seçimler yapabilen bir fonksiyon kabul edilebilir.
Fonksiyonlar ise, bunu genellikle pek beceremiyorlar.
sizin sayenisde odevımı buldum tesekkur edrım…
yha tamam haklısının zama ben size birler onlar yüzler binler onbinler yüz binler milyonlar on milyonlar yüzmilyonlardan sonra gelenleri soruyorumm
yazının üzerinden yıllar geçmiş ama yine de yorum yapmak istedim. yazılımla pek bir alakam olmasa da bilgisayarların rasgele seçimi nasıl yaptıklarını hep merak etmiştim ve doğru bir şekilde yapabileceklerini hiç düşünmemiştim açıkçası. yazınızı bulunca sevindim. biraz bilgi sahibi olmuş oldum bu konuda. teşekkürler