Bu sayfadaki yazılar
Sayfanın metni
Sayfa 22
Çoğu makine dili programcısı zaman zaman rastlantısal sayılara ihtiyaç duymuştur. Kimi zaman bir zar atmak için, kimi zaman oyundaki rakibin karşınıza çıkma zamanını belirlemek için rastlantısal bir değer bulmak için bütün kaynaklarınızı karıştırdığınız olmuştur. Ama bulunan sistemler ya üç kanal müziğinizi berbat etmiştir ya da raster interruptlarla kullanılamamıştır. Oysa uzun süre boyunca kendini tekrar etmeden rastlantısal değerler üretebilecek bir formül işinize yarardı sanırım. Burada “rastlantısal” değerini kullanırken biraz yüzüm kızarıyor açıkçası. Çünkü herhangi bir metodla tam rastlantısal değer üretme şansınız yoktur. Aynı şartları sağladığınızda, aynı sayıları üretir burada açıklanan yöntemler. Bir diyot üzerinde oluşan gürültü voltajını örnekleyerek tam rastlantısal sayılar elde edebilirsiniz tabii ki, ama bu yöntemi kullanırsanız tüm sayıları bir tabloya yerleştirmeniz gerekir ve bu sayede büyük bir bellek alanını sayılara kaptırırsınız. Bir de, programı her çalıştırdığınızda aynı tesadüfi sayılarla karşılaşırsınız. Bu yüzden bu sayıları yarı-rastlantısal sayılar denir. Yüksek seviyeli dillerde yarı-rastlantısal sayıları elde edebilmek için komutlar vardır. Kimi zaman yeterince iyi sonuç vermese de bu sayılara erişim oldukça kolaydır. Rastlantısal sayılarda “iyi”lik kavramını kontrol etmek için şu faktörleri göz önüne almalıyız: Bir algoritmayla elde ettiğimiz sayılar bir süre sonra kendini tekrar edeceklerdir. Bu özellikten kurtarma gibi şansımız da yoktur. İkinci olarak da, farklı sayılara rastlama sıklığı değişkendir. Bu yüzden belli sayılar daha sık karşımıza çıkar. Her zaman, bir rastlantısal sayı dizisinin elemanlarının kendini tekrarlamaya başlamadan önce uzun bir süre devam etmesini isteriz. Bazı metodlar, dört-beş sayıdan sonra kendini tekrarlamaya başlar. Bazılarıysa, kendini tekrarlamadan önce astronomik miktarlarda sayı üretebilir. Bu yüzden kullandığınız yüksek seviyeli dilin rastlantısal sayı üretme yeteneğinin o kadar iyi olduğunu gözü kapalı öne süremezsiniz. Eğer rastlantısal sayılara ihtiyacınız varsa, düzgün bir dağılımla sayı üretilmesini istersiniz. Eğer sayı üreticiniz iyi çalışmıyorsa, bazı sayılarda yığılma ola- 22
DEVRİM KORKMAZ bilir. Yani beş yüz rastlantısal sayı arasında yüz adet sayısına karşılık yalnızca iki adet “iki” elde edebilirsiniz. Tabii ki çok düzgün bir dağılım elde edilebilecek yöntemler bulunabilir, ama burada bu kadar derinlemesine bir araştırma yapmaya niyetimiz yok.
Kendi Zarınızı Atın
Makine dilinde program yaparken, genel olarak rastlantısal sayılar üretecek bir rutine erişim yapamazsınız. Tabii ki ROM'da bulunan rutinleri kullanabilirsiniz, ama bunu yapamayacağınız zamanlar da olacaktır. Makine dilinde çok uzun sürelerde bile kendini tekrar etmeyen, bunun yanında oldukça iyi bir dağılıma sahip sayılar üretebilecek yöntemler var tabii ki. O kadar derinlemesine bir araştırma yapmamamıza rağmen, oldukça işinize yarayacak bir yöntem olduğunu düşünüyoruz. Tekniği incelemeden önce biraz daha temel oluşturalım isterseniz. Şekil 1'e bir göz atarsanız, değeri yalnızca 0 veya 1 olabilecek olan hücreleri kullanarak nasıl 0 veya 1 sayılarını rastlantısal olarak elde edebileceğimizi görebilirsiniz. Her hane kendi değerini bir yandaki haneye iletirken, ikinci ve beşinci hanelerindeki değerler EOR'lanıp (iki sayı eşitse sonuç 0, farklıysa sonuç 1 olur. Ör: EOR 1-0) ilk haneye iletilir. Bu şekilde üretilen 0 ve 1 sayıları oldukça tesadüfi bir şekilde oluşur. Burada yalnızca beş hane olduğu için kısa bir süre sonra 0 ve 1 sırası kendini kısa sürede tekrar etmeye başlar. Ama 30 hanelik bir sistem kullansaydık 0 ve 1 rutininin kendini tekrar etmeye başlaması için tam (2^30)-1 tane değer okumamız gerekecekti. Saniyede 1000 sayı okuyabilseydik, tam 300 saat sonra kendini tekrarlamaya başlayacaktı bu seri. Ama hangi kutulara EOR işleminin uygulanacağı gene de bir problem olarak kalmaktadır. Bu kutuları seçmek için bir matematik teoremi bulunmaktadır tabii ki. Ama bu teorem çok karmaşık olduğu için burada anlatmayacağız. 34 kutuya kadar olan sistemlerde hangi kutulara bu işlemin uygulanacağını Şekil 2'de bulunan tablodan görebilirsiniz. Bu tür sistemler elektronikte de sıkça kullanılmaktadır. “İyi de ikili sistemlerden bana ne? Ben ondalık sayılarla çalışmak istiyorum!” diyebilirsiniz tabii ki. Ama bu sistemi, her kutucuğa 0'dan 9'a kadar olan sayıları koyup kullanabilirsiniz. Tabii ki o zaman EOR komutunu kullanamazsınız. Ama EOR işlemi aslında MOD 2'de yapılmış bir toplamayla aynı sonucu verir. Yani iki değeri toplayıp 2'ye böldüğünüzde, kalan sizin istediğiniz sayı olacaktır. Yani kutulara 0'dan 9'a kadar olan sayıları yerleştirirseniz MOD 10'da bir toplama yapmanız yeterlidir (6+7=3 MOD 10). Son bir şey daha: Her kutucuğa koyacağınız sayının maksimum değeri, kutu sayısından az olmamalıdır. Eğer bu kuralı çiğnerseniz maksimum uzunlukta kendini tekrarlamama özelliğinden yararlanamazsınız. Yani 8 kutunuz varsa, her kutuya maksimum 7 değerini verebilirsiniz.
< *t <
Şekil-1: Rastlantısal sayı üretmek için kullanılan sistem.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 23
Yazılımla da Yapalım mı?
Elektronikte işlerin nasıl yürüdüğüne baktığımıza göre, sıra yazılıma geldi sanırım. 30 kutulu ikili sayıların 300 saatten önce kendini tekrarlamadığını söylemiştik. Eğer 30 kutulu ve her kutuda 0'dan 9'a kadar sayılar olan bir sistem kursaydık ve saniyede bin değer okuyabilseydik, bu sistem kendini tekrarlamaya başlamadan önce tam 36,533,877 yıl geçmesi gerekecekti. Yanlış okumadınız, otuzaltı milyon yıl dedim. Tabii ki hepimiz bu rastlantısal sayıları bilgisayarımızda yaratmak istiyoruz. Bilgisayarımızı yukarıda anlattığım kutu sistemini kullanması için programlamak oldukça kolay. Her kutucuğa bir bayt ayırırsak, kutular maksimum 255 değerini alabilir ki bu değer bizim ihtiyacımız olanın kat kat üzerindedir. Kutuları çalıştırmadan önce her birine gerekli aralıkta bir sayı vermemiz gerekmektedir. Eğer tüm kutuları sıfırla doldurursak her seferinde oldukça rastlantısal olan sıfır değerini alırız. Programı yaparken Şekil 2'de bulunan kutuları birbirine gerekli MOD'da eklemeyi unutmayın. Bu yazılım kutularının gerçekten çalışması için şöyle bir mantık yürütmeliyiz: İlk olarak gerekli kutuları toplarız ve bu toplamanın değerini geçici bir yere yazarız. Daha sonra en son kutudan bir öncekini en son kutuya alıp, bu şekilde aşağı doğru inerek her kutunun değerini bir sonrakine yazarız. Son olarak da geçici yerde sakladığımız değeri ilk kutuya yazarsak bir tur tamamlamış oluruz. Herhangi bir kutudaki değeri çıktı olarak kullanabilirsiniz ama her okuyuşunuzda aynı kutuyu kullanmaya özen gösterin.
Şekil-2: Maksimum sayıda rastlantısal sayı elde etmek için birbirine eklenmesi gereken kutular bunlardır.
Programlarımız da Var
1. programımız (RND1) 21 kutulu, MOD 10'da çalışan bir makine dili program. Programı kullanmadan önce bu 21 kutuyu 10'dan küçük değerlerle doldurmayı unutmayın. Program 2 ise program 1'i belleğe yükleyen, daha sonra da çalışmasını size gösteren bir BASIC programı. Bu programı çalıştırdığınızda ilk olarak 21 basamaklı bir sayı girmeniz istenir. Daha sonra bu basamaklar kullanılarak üretilen tesadüfi sayılar ekrana yazılırlar. RND1 aslında bu tür bir uygulamayı yazmanın ne kadar kolay olduğunu anlatmak için yapılmış bir programdır. Program 3, yani RND2 kutuların 16'sını doldurmuştur ve yalnızca iki beşini size sorar. Daha sonra ilk sayı üretilmeden önce
2560 kere kutu kaydırılır ve bu sayede 'orijinal sayıların ortadan kaybolması sağlanır. Programı ilk kullandığınızda $2341'den çalıştırın, daha sonra $234A'ya sıçrayarak yeni rastlantısal sayınızı elde edin. Program 4, program 2'nin yaptığının aynısını program 3 için yapan bir BA-SIC programıdır. Bu iki program aynı şekilde çalışır ve 0-9 arası bir değer verir çıktı olarak. Eğer istediğiniz sayının basamak sayısı 1'den fazlaysa belli ku-