Sayfalar

1 Eylül 2010 Çarşamba

rastgele olmayan bir rastgelelik

      Bilgisayar dünyasında bizi tekdüzelikten kurtaran ve sıradışılığa iten en önemli, en temel fonksiyon olan rand() fonksiyonuna teşekkürleri bir borç bilmeliyiz :) O olmasaydı yazılan oyunlarda rastgele olan birşey olmayacaktı. Düşmanların yeri belli olacak, nesneler aynı yerlerde, şekillerde ve konumlarda fırlayacaktı. Programlarda karşımıza çıkan ufak bilgi ekranlarında rastgele çıkan bir sıra olmayacaktı… bu gibi örnekler düşündükçe artar. O yüzden fazla dalmak istemiyorum. İşte bu fonksiyon olmasaydı geliştiriciler sayılarını kendileri rastgele bir sıraya koyacaklardı ancak o konulan rastgele sıranın da belli bir dizilimi olacaktı vb…
      1′den 10′a kadar olan sayılardan 5 tanesiini seçmeniz istense bunu rahatlıkla çok çeşitli sıralarda yapabilirsiniz. Bir sabah çayınıza her zamankinden biraz daha fazla şeker koymayı tercih edebilirsiniz. Bunlar bizim zihnimizle yaptığımız mantıklı tercihlerdir. Söz konusu olan bu seçim işlemini bilgisayardan isteseydik bunu onun anlayacağı kod dizilimine dökmemiz gerekecekti. Ardından çalıştırdığınızda bazı seçimler yaptığını görecektik. Ancak bu seçimlerin ne kadarı bizim özgür irademizle yaptığımız tercihler ile eş değer nitelikte olacak? Eğer ki bizimkiyle aynı seviyede bir tercih olduğu öne sürülürse bu insanlığın geliştirdiği en temel düzeyde bir yapay zeka örneğidir diyemez miyiz? Bence kesinlikle diyemeyiz. Bunun nedenini şöyle açıklayayım. Random fonksiyonu çalıştığında ortaya belli sayılar üretir. Ancak bu sayılar nereden gelmektedir? Nasıl bir düzene göre sıralanmaktadır? Ya da düzensiz mi ilerlemektedir? Sonuçta bu bir fonksiyon, bir dizi tanımlanmış koddan ibaret. Nasıl olabilir de bir bireyin yaptığı gibi tercihler yapabilir?
       Diyelim ki geliştirici “[2] [3] [5] [1] [4]“ şeklinde bir dizi hazırlamış ve bu diziyi bir for döngüsü içinde baştan sonra kadar döndürüyor olsun. Ancak ikinci çalışmadan sonra bu uygulama yine aynı değerleri dönderecektir. Buna çözüm olarak şu denenebilir örneğin; dizi, başlangıç değerinden bitiş değerine kadar dizinin genişliği kez dönderilir bir döngü içerisinde. bu durumda iç içe iki tane for döngüsü iş görecektir. döngü içerisinde de ilk döngünün değeri ikinci döngünün değeri ile işleme tabi tutulabilir. bu durumda 5 farklı değer yerini 25 elemanlı, içinde aynı sayıları da barındırabilen ancak farklı sıralarda bulunan bir diziye bırakacaktır. yani yeni dizimiz işlem için çarpımı tercih ettiğimiz düşünülürse şu şekilde olacaktır: 
“[2x2] [3x2] [5x2] [1x2] [4x2]“
“[2x3] [3x3] [5x3] [1x3] [4x3]“
“[2x5] [3x5] [5x5] [1x5] [4x5]“
“[2x1] [3x1] [5x1] [1x1] [4x1]“
“[2x4] [3x4] [5x4] [1x4] [4x4]“
ancak bu yöntemin de tahmin edilme ihtimali vardır zira bu da bir yerden sonra kendini tekrar edecektir ancak sayı olasılıklarını arttıracak bir yöntemdir.
      Bu da bizi kesmedi! Bize lazım olan şey bu tanımlı olan dizinin sürekli değişen ancak bir daha kendini tekrarlamayan bir sayıyla işleme sokulmasıdır. Bizim ihtiyacımız olan sayıyı üreten fonksiyonun her dilde karşılığı var ve aynı sonuçları vermesine rağmen farklı isimlere sahip olabilir. C++’da aradığımız bu sayı, time() fonksiyonunun ve NULL parametresinin birleşimi olan time(NULL) işleminin sonucunda üretilmektedir. Peki nedir bu işlem sonucunda ortaya çıkan kurtarıcı sayi? Tabi ki de uzun zaman önce mantığı standartlaştırılmış olan bu sayı 1970 yılından bugüne kadar geçen saniyeden ibarettir. Fonksiyon ne zaman çağrılırsa, o ana kadar geçen saniyeyi hesaplayıp sonuç olarak dönderir.
      Şimdi sürekli değişecek olan sayımızı nasıl elde edebileceğimizi de öğrendikten sonra geldi sıra rastgele sayı üretmeye. Bu fonksiyon ile bizim dizimizi matematiksel olarak bir işleme sokarsak üretilen değerler farklılaşacaktır ve sürekli değişecektir. Bu noktada tanımlanmış bir dizinin farklılığı söz konusudur. işte random sayı üretmek bundan ibarettir :)
      Şimdi ben o kadar uğraştım didindim ancak zaten var olan fonksiyonu bir kere daha üretmenin alemi nedir diye sorduğunuza eminim :) malum c++’da rand() fonksiyonu halihazırda vardı zaten fakat bilmem dikkat edeniniz oldu mu ancak rand fonksiyonu da yukarıda anlattığım dizi örneğindeki gibi hep aynı değerleri üretir.
Eğer ki rand() fonksiyonunu bir for dizisine tabi tutarsanız aşağıdaki resimdeki sonucu elde edeceksiniz;
      Resimde gördüğünüz ve 41 ile başlayan dizi hep sabittir. Pek çok farklı bilgisayarda denedim ( işlemci, anakart, HDD, RAM vb.. açısındandan yani donanım açısından kesinlikle farklı bilgisayarlar ve farklı işletim sistemleri ile de denedim )ve elde ettiğim sonuç hep bu sıralamadan ibaretti. Bu durumda şu sonuç ortaya çıkıyor rand() fonksiyonu sadece bir diziden ibaret. Belki benim yukarıda bahsettiğim kadar basit bir dizi olmayabilir ama sıralanmış olduğu aşikardır. Bu problemi çözmek için rand() fonksiyonu ile birlikte “srand(time(NULL))” fonksiyonunu verilen parametre değerleri ile birlikte kod sistemi içinde uygulamak yeterlidir. Sonuç olarak ortaya çıkan değer zamana bağlı olarak farklılaşacaktır. Aşağıda srand() fonksiyonunu kullanmadan rand() dizisinin nasıl time(NULL) değeri ile birlikte kullanılabileceğine örnek verdim :

      Resimde gördüğünüz ” t = time(NULL) “ satırı yerine srand(time(NULL)) yazarsanız ” sayi*t “ işlemine gerek kalmadan rand() otomatik olarak farklı değerler üretecektir.
      Sonuç olarak;o kadar yazının ardından elimize ne geçti? :) rand() fonksiyonu kesinlikle ranstgele sayı üreten bir fonksiyon değil. Tanımlanmış bir dizinin sürekli artan bir sayı ile çarpımının sonucundan ibaret. Bu yüzden de asla yapay zekanın temel taşı olduğunu söyleyemem ancak kendi kararlarını ve tercihlerini yapabilecek seviyede bir fonksiyon üretilebildiği zaman bu iş önünde saygı ile eğilirim :) fakat halihazırda kendisine verilen görevi en iyisiyle yapmakta olduğuna da söyleyecek bir sözüm yok benim derdim sadece kavram yanılgısında :) Bu noktada şu uyarıda bulunayım; rand() fonksiyonunun benim bilmediğim daha gizemli bir kısmı da mevcut olabilir ama olsun üzerinde düşününce bu sonuca vardım :) yanlışlarım veya mantık hatalarım varsa lütfen söyleyiniz, eğer varsa affola :)

Hiç yorum yok:

Yorum Gönder