programlama dilleri 1 - bilecik Şeyh edebali...
TRANSCRIPT
Programlama Dilleri 1
Ders 3: Rastgele sayı üretimi ve uygulamaları
Ders 3 Genel Bakış
Giriş
Rastgele Sayı
Rastgele Sayı Üreteci
rand Fonksiyonunun İşlevi
srand Fonksiyonunun İşlevi
Monte Carlo Yöntemi
Uygulama 1: Yazı-Tura Simülasyonu
Uygulama 2: Zar Simülasyonu
Uygulama 3: MC ile Pi sayısının hesabı
2 Programlama Dilleri 1
Giriş
Bilimsel uygulamalarda problemler iki kısımda incelenebilir:
Kesin sistemler, kuralları kanun hükmünde olan matematiksel yasalarla tanımlanabilen sistemlerdir; Örneğin yerçekimi yasası gibi
Tahmini sistemler, başlangıç koşulları kesin olarak tayin edilemediği için sonuca dair çözümün tahmin edilerek bulunduğu sistemlerdir. Yoksa, evrende raslantıya yer yoktur. (Monte Carlo Yöntemi)
Programlama Dilleri 1 3
Rastgele Sayı
Bir kümenin veya dizinin elemanlarından bir
kısmının, veya tamamının istatiksel olarak rastgele
seçilmesi yoluyla üretilmiş sayılara rastgele sayı adı
verilir.
Rastgele sayı üretimi matematiğin önemli
konularından biridir.
Rastgele sayılar ya da daha doğru ifadeyle, rastgele
izlenimi veren sayılar (sözde rastgele sayılar -
pseudo random numbers) istatistik, ekonomi,
matematik gibi pek çok alanda olduğu gibi
programcılıkta da kullanılmaktadır.
4 Programlama Dilleri 1
Rastgele Sayı
Bilgisayarlar kesin (deterministic) bir yapıda çalıştıkları
için gerçek anlamda rastgele sayı üretemezler.
Ancak, uygun algoritmalarla bir bilgisayarın düzgün bir
dağılımdan seçilen ve genellikle [0,1] arasında gerçel
değerler alan rastgele sayı üretmesi sağlanabilir.
Bilgisayarların ürettiği bu rastgele sayılar yalancı
rastgele sayı olarak adlandırılır. Rastgele sayı üreten bu
algoritmalara rastgele sayı üreteci denir.
Günümüz derleyicilerinin bir çoğunda rastgele sayı
üreteçleri için hazır kütüphane fonksiyonları
tanımlanmıştır.
Programlama Dilleri 1 5
Rastgele Sayı Üreteci
Rastgele sayılar bir rastgele sayı üreticisi (random number generator) tarafından üretilirler.
Rastgele sayı üreticisi aslında matematiksel bir fonksiyondur. Söz konusu fonksiyon bir başlangıç değeri alarak, bir değer üretir.
Daha sonra ürettiği her değeri girdi olarak alır ve tekrar başka bir sayı üretir.
Üreticinin ürettiği sayılar rastgele izlenimi vermektedir.
6 Programlama Dilleri 1
rand Fonksiyonunun İşlevi
Standart rand işlevi rastgele sayı üretir. Bu işlevin
bildirimi aşağıdaki gibidir:
int rand(void);
C standartları rand işlevinin rastgele sayı üretimi
konusunda kullanacağı algoritma ya da teknik üzerinde
bir koşul koymamıştır.
Bu konu derleyiciyi yazanların seçimine bağlı
bırakılmıştır. rand işlevinin bildirimi, standart bir başlık
dosyası olan stdlib.h içindedir.
rand işlevi için başlık dosyası kaynak koda eklenmelidir.
#include <stdlib.h>
7 Programlama Dilleri 1
rand Fonksiyonunun İşlevi
rand fonksiyonunun örneği,
8 Programlama Dilleri 1
rand Fonksiyonunun İşlevi
Programlarda bazen belirli bir aralıkta rastgele
sayı üretmek istenebilir. Bu durumda rand işlevi
mod operatörü olarak kullanılabilir :
rand( ) % 2 => Yalnızca 0 ya da 1 değerini üretir.
rand( ) % 6, =>0 - 5 aralığında rastgele bir değer üretir
rand( ) % 6+1 =>1 - 6 aralığında rastgele bir değer üretir.
rand( ) % 6+3 =>3 - 8 aralığında rastgele bir değer üretir.
4+rand() %16 =>4 - 19 aralığında rastgele bir değer üretir.
9 Programlama Dilleri 1
rand Fonksiyonunun İşlevi
MIN ve MAX aralıklarında rastgele tamsayı
değerleri üretmek için aşağıdaki kodu yazmak
gereklidir:
int a = MIN + rand( ) % (MAX-MIN+1);
[-15 45] => -15+rand( ) % (45+15+1) => -15+ rand( ) % 61;
[100 250) => 100+rand( ) % (249-100+1) => 100+ rand( ) % 150;
(-150 -50] => -149+rand( ) % (-50+149+1) => -150+ rand( ) % 99;
10 Programlama Dilleri 1
rand Fonksiyonunun İşlevi
5 ile 20 arasında rastgele sayı üretme
11 Programlama Dilleri 1
rand Fonksiyonunun İşlevi
Aşağıdaki örnekte 10 tane rastgele sayı ekrana
yazdırılıyor.
12 Programlama Dilleri 1
Yandaki kaynak kod ile
oluşturulan programın her
çalıştırılmasında ekranda
aynı sayılar yazılmaktadır.
rand Fonksiyonunun İşlevi Oluşturulan program her çalıştırıldığında neden hep aynı sayı
zinciri elde ediliyor?
rand işlevi rastgele sayı üretmek için bir algoritma kullanıyor.
Bu algoritma derleyiciden derleyiciye değişse de, rastgele
sayı üretiminde kullanılan ana tema aynıdır.
Bir başlangıç değeri ile işe başlanır. Buna tohum değeri (seed
value) denir. Bu değer üzerinde bazı işlemler yapılarak
rastgele bir sayı elde edilir.
Tohum değer üzerinde yapılan işlem bu kez elde edilen
rastgele sayı üzerinde yinelenir.
rand işlevi çağrılarını içeren bir program her
çalıştırıldığında aynı tohum değerinden başlanacağı için aynı
sayı zinciri elde edilir.
13 Programlama Dilleri 1
srand Fonksiyonunun İşlevi
Bazı durumlarda, programın her çalıştırılmasında
aynı rastgele sayı zincirinin üretilmesi istenmez.
Örneğin, bir oyun programında programın
çalıştırılmasıyla hep aynı sayılar üretilirse, oyun hep
aynı biçimde oynanır.
Programın her çalışmasında farklı bir sayı zincirinin
elde edilmesi için, srand işlevinin rastgele sayı
üreticisinin tohum değerini programın her
çalışmasında başka bir değer yapması gerekir.
Bu amaçla çoğu zaman standart time işlevi
işlevinden faydalanılır.
14 Programlama Dilleri 1
srand Fonksiyonunun İşlevi
time standart bir C işlevidir, bildirimi standart bir başlık dosyası
olan time.h dosyası içindedir.
time işlevi kendisine 0 değeri gönderildiğinde, önceden belirlenmiş
bir tarihten (sistemlerin çoğunda 01.01.1970 tarihinden) işlevin
çağrıldığı ana kadar geçen saniye sayısını geri döndürür.
İşlevin geri dönüş değeri, derleyicilerin çoğunda long türden bir
değerdir.
İçinde rastgele sayı üretilecek programda, srand işlevine argüman
olarak time işlevinin geri dönüş değeri gönderilirse, program her
çalıştığında, belirli bir zaman geçmesi nedeniyle, rastgele sayı
üreticisi başka bir tohum değeriyle ilk değerini alır.
Böylece programın her çalıştırılmasında farklı sayı zinciri üretilir:
srand(time(0));
15 Programlama Dilleri 1
srand Fonksiyonunun İşlevi
Daha önce yapılan örnek
uygulamada program her
çalıştırılmasında aynı
rastgele değerleri bulurken
srand() fonksiyonunun
eklenmesiyle farklı sonuçlar
elde edilmektedir.
16 Programlama Dilleri 1
Monte Carlo Yöntemi
Monte Carlo Yöntemi rastgele sayılarla denenerek yaparak sonuca ulaşmayı amaçlayan deneysel bir yöntemdir. Bu şekilde matematiksel ve fiziksel problemlerin çözümü amaçlanmaktadır
Los Alamos Bilimsel Laboratuar’ından John Von Neumann, Stan Ulam ve Nick Metropolis adlarında üç bilim adamı tarafından ortaya çıkarılmıştır.
Metropolis algoritması olarak da bilinir. Algoritma, kesin çözüm yapmanın zor olduğu problemlerde tahmini çözümlere gitmeyi amaçlar. Yani olasılık teorisi üzerine kurulmuştur.
17 Programlama Dilleri 1
Monte Carlo Yöntemi
Monte Carlo yönteminin temel amacı, büyük elemanlar topluluğunun özelliklerinin, rastgele olarak seçilmiş bir alt kümesi aracılığı ile çıkartılmasıdır.
Örneğin herhangi bir f(x) fonksiyonunun (a,b) aralığındaki beklenen değerinin, bu fonksiyonun yine bu aralıkta, rastgele seçilen sonlu sayıdaki noktalarındaki tahmini değerinden çıkartılmasını amaçlar.
18 Programlama Dilleri 1
Monte Carlo Yöntemi
Monte Carlo (MC), rastgele sayıları baz alarak tahmini
sistemleri modeller.
Hatta, bazı kesin sistemlerde de kullanılabilir; Örneğin
rastgele sayılarla Pi sayısını veya bir fonksiyonun integralini
hesaplamak gibi. MC yöntemleri, Fizik ve Mühendislik
alanlarında pek çok uygulama alanı bulmuştur. Bunlardan
başlıcaları:
o [Matematik] Sayısal Analiz
o [Fizik] Doğal olayların simülasyonu
o [İstatistik] Dağılım Fonksiyonları
o [Mühendislik] Deneysel aletlerin (örneğin detektör) simülasyonu
19 Programlama Dilleri 1
Uygulama 1: Yazı-Tura Simülasyonu
Hilesiz bir para atıldığında, yazı veya tura gelme olasılığı
(P:probability) eşit ve kuramsal olarak P = 1/2 dir. Düşünün ki bir
para n kez atılsın ve gelen turaları sayıp ve t ile gösterelim.
Deney sayısı, n, arttıkça t/n oranı kararlı (sabit) kalmaya başlar. Bu
durumda, olasılığın istatiksel tanımı şöyle yapılır:
P(t) = t/n
n sonsuza giderken P(t) değeri P = 1/2 değerine yaklaşır.
Şimdi, [0, 1] aralığından rastgele seçilen sayıları kullanarak, para
atma deneyini yapalım.
Rastgele sayı üreteçleri sayıları eşit olasılıkla üretir. r bir rastgele
sayı olsun. r < 0.5 durumuna tura, r >= 0.5 durumuna da yazı
diyelim. Bu şekilde, bir döngü kullanarak deney sayısına (n) göre,
yazı-tura simülasyonu yapılabilir.
20 Programlama Dilleri 1
Uygulama 1: Yazı-Tura Simülasyonu
Programlama Dilleri 1 21
Uygulama 1I: Zar Simülasyonu
Bu uygulamada, bir çift zar atımı modellenecektir. Bu, bir çok tavla programında kullanılan yöntemdir.
Bir çift zar atılıyor. Zarların toplamının 7 olma olasılığını bulan bir program verilmektedir. Zar, [1, 6] arasında rastgele tamsayı değeri alır.
Buna göre, r [0,1] arasında rastgele gerçel sayı ise, bu zarın MC modeli:
ozar = 1 + tamsayı(6*r) şeklinde olur.
22 Programlama Dilleri 1
Uygulama 1I: Zar Simülasyonu
Programlama Dilleri 1 23
24 Programlama Dilleri 1
Analitik düzlemde daire formülü.
Birim dairenin yarıçapı 1 olduğundan
y’ yi x cinsinden yazarsak
Dairenin alanı
Pi sayısı (π), bir dairenin çevresinin çapına bölümü ile elde edilen
matematik sabitidir. Günlük kullanımda genel olarak 3, 3.14 veya 3.1415
olarak ifade edilmesine rağmen gerçek değeri bilinmemektedir.
Birim daire ile ilgilendiğimizden dolayı alan π’ dir.
Monte Carlo yöntemi kullanılarak bulunacak bölgenin
alanı, π/4 olan çeyrek dairenin alanı olduğundan, bu
çeyrek dairenin alanını bularak pi sayısına ulaşmış
oluruz.
Uygulama 3: MC ile Pi sayısının hesabı
Uygulama 3: MC ile Pi sayısının hesabı
Programlama Dilleri 1 25