28.02.2015 Views

C Kitabı

Buraya açıklama gelecektir

Buraya açıklama gelecektir

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.

Bilgisayarlar kesin (deterministic) bir yapıda çalıştıkları için gerçek anlamda rastgele sayı<br />

üretemezler. Ancak, uygun algoritmlarla bir bilgisayarın düzgün bir dağılımdan seçilen ve<br />

genllikle [0,1] arasında gerçel değerler alan rastgele sayı üretmesi sağlanabilir. Bilgisayarların<br />

ürettiği bu rastgele sayılar yalancı rastgele sayı (pseudo-random numbers) olarak adlandırılır.<br />

Rastgele sayı üreten bu algoritmalara rastgele sayı üreteci (random number generator) denir.<br />

Günümüz derleyicilerinin bir çoğunda rastgele sayı üreteçleri için hazır kütüphane<br />

fonksiyonları tanımlanmıştır.<br />

Bu fonksiyonlar genellikle doğrusal bir denklem kullanarak, rastgele sayı dizisi üretir. 32-bit<br />

makinalarda, dizinin peryodu en az 2 31 ~ 10 9 (1 milyar) dur. Yani, bir rastgele sayı üreteci<br />

birbirinden farklı 1 milyar farklı sayı üretebilir. Bu kadar çok sayı günümüz bilgisaylarında<br />

bir kaç saniyede kolaylıkla oluşturulabilir.<br />

Rastgele sayı dizisini oluşturacak doğrusal denklemin genel biçimi şöyledir:<br />

x n+1 = ( a x n + b ) mod m<br />

burada mod modüler aritmetik işlemi anlamındadır. Dizinin ilk elemanı, x o , çekirdek (seed)<br />

olarak adlandırılır. a ve b sabitleri, dizi elemanları kargaşık ve düzgün dağılacak şekilde<br />

seçilir.<br />

1960 yılında IBM şirketi aşağıdaki meşhur RANDU algoritmasını kullanmıştır (a = 69069, b<br />

= 0):<br />

x n+1 = ( 69069 x n ) mod 2 31 -1<br />

Daha sonra Park ve Miller, aşağıdaki Minimal Standart algoritmasını önermiştir (a = 16807, b<br />

= 0):<br />

x n+1 = ( 16807 x n ) mod 2 31 -1<br />

Park-Miller algoritması ile oluşturulan rastgele sayı üreteci, aşağıdaki C fonksiyonu ile<br />

kotarılabilir:<br />

/*<br />

* Park-Miller algoritması ile [0,1] arasında<br />

* düzgün dağılmış rastgele sayı üretir.<br />

*/<br />

float rastgele(int *cekirdek)<br />

{<br />

const int im = 2147483647, ia = 16807;<br />

const int iq = 127773, ir = 2836;<br />

const float m = 128.0/im;<br />

int k;<br />

float r;<br />

k = *cekirdek / iq;<br />

*cekirdek = ia*(*cekirdek-k*iq) - ir*k;<br />

if(*cekirdek < 0) *cekirdek += im;<br />

r = m * (*cekirdek/128);<br />

}<br />

return r;<br />

Program 24.1'de, rastgele() fonksiyonu kullanılarak 10 sayı üretilmiştir. Program her<br />

çalıştırıldığında aynı sayılar üretilecektir. Bunun nedeni kümenin ilk elemanı ilk_sayi sabit<br />

olmasıdır.

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

Saved successfully!

Ooh no, something went wrong!