Commodore sayı 69, sayfa 22
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ı.