08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

Rastgele Gerçek Sayı Üretimi<br />

Rastgele gerçek sayı üreten bir standart C işlevi yoktur. Ancak RAND_MAX simgesel<br />

değişmezinden faydalanarak<br />

(double)rand() / RAND_MAX<br />

ifadesi ile 0 – 1 aralığında rastgele bir gerçek sayı üretilebilir. Aşağıda rastgele gerçek<br />

sayı üreten drand isimli bir işlev tanımlanıyor. İşlevi inceleyerek, rastgele bir gerçek<br />

sayıyı nasıl ürettiğini anlamaya çalışın:<br />

#define PRECISION 2.82e14<br />

double drand()<br />

{<br />

double sum = 0;<br />

double denom = RAND_MAX + 1;<br />

double need;<br />

}<br />

for (need = PRECISION; need > 1; need /= (RAND_MAX + 1.)) {<br />

sum += rand() / denom;<br />

denom *= RAND_MAX + 1.;<br />

}<br />

return sum;<br />

int main()<br />

{<br />

int k;<br />

}<br />

for (k = 0; k < 10; ++k)<br />

printf("%lf\n", drand());<br />

return 0;<br />

Aşağıda pi sayısı Monte Carlo yöntemi diye bilinen yöntemle bulmaya çalışılıyor. Bu<br />

yöntemde birim kare içinde yarıçapı karenin kenar uzunluğuna eşit bir daire parçası<br />

olduğu düşünülür. Birim kare içinde rastgele alınan bir nokta, ya daire parçasının içinde<br />

ya da dışında olur. Rastgele alınan bir noktanın daire parçasının içinde olma olasılığı,<br />

yarıçapı 1 birim olan bir dairenin alanının dörtte birinin, kenarı 1 birim olan karenin<br />

alanına oranıdır. Bu da<br />

4<br />

π değerine eşittir. O zaman n tane rastgele nokta alıp bu<br />

noktaların kaç tanesinin dairenin içinde olduğunu bulursak, bu değerin n sayısına oranının<br />

4 katı π sayısını verir:<br />

#include <br />

#include <br />

#include <br />

#define NTIMES 10000000<br />

int main()<br />

{<br />

double x, y;<br />

int k;<br />

int inside_counter = 0;<br />

srand(time(0));<br />

for (k = 0; k < NTIMES; ++k) {<br />

x = (double)rand() / RAND_MAX;<br />

197

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!