Ana içeriğe atla

C++ Rand() Srand() Time(0) Kullanımı

 

#include <iostream>

#include <cstdlib> // rand fonsiyonu kütüphanesi için

#include <ctime> // time fonksiyonu kütüphanesi için

using namespace std;


// Örnek 4 Mülakat sorusu :

//Bir fonskiyon içinde min ve max dahil rastgele tam sayı üretsin

//Fonskiyonumuz :

int mulakat_Sayi(int max, int min) 

{

int mulakat = min + (rand() % (max - min +1));

return mulakat;

//Not : Detaylı anlatım alttadır.

}


int main() 

{

// rand() //Tek başına kullanıldığında rastgele ürettiği sayıyı değitirmez ilk ürettiği sayıyı üretmeye devam eder.

// srand() //başlangıç noktasını belirler

// time(0) : saniye cinsinden rastgele sayı üretir

// donanım için test verisi üretme ve dosyaya yadırma amaçlı ve oyun geliştirmede kullanılabilir


srand(time(0)); // Rastgele sayısını time ile üretiyoruz her çalıştığında farklı sayı üretir



cout << "***** rastgele *****" << endl;

int rastgele_Sayi = rand(); //Tekbaşına herzaman aynı sayı Çıktı: 41 herzaman aynı olur değiştiremez.

cout << "Rastgele uretilen sayi : " << rastgele_Sayi << endl;


// 1 ile 10 arasında ratgele sayı üretme ör:

cout << "*****1 ile 10 arasinda rastgele*****" << endl<<endl;

int rastgele_Sayi2 = (rand() % 10) + 1; // üretilen sayının 10'a bölümünden kalan sayı +1 arttır

cout << "1 ile 10 arasinda rastgele sayi : " <<rastgele_Sayi2<< endl;


//1 ile 100 arasında rastgele sayı üretme ör:

cout << "*****1 ile 100 arasinda rastgele*****" << endl<<endl;

int rastgele_Sayi3 = (rand() % 100) + 1;

cout << "1 ile 100 arasinda uretilen rastgele sayi : " << rastgele_Sayi3 << endl;



// Örnek 4 Mulakat sorusu:

cout << "*****Ornek 4 Mulakat sorusu*****" << endl<<endl;

int min, max;

cout << "Minimum degeri giriniz : ";

cin >> min;

cout<<"Maximum degerini giriniz : ";

cin >> max;

int sayi = mulakat_Sayi(min, max);

cout << min << " ile " << max << " arasindaki rastgele sayi " << sayi << endl;

cout << " " << endl;



// Örnek 5 for döngüsü ile rand() 

cout << "*****Ornek 5 for dongusu ile rand()*****" << endl<<endl;

for (int i = 0; i < 5; i++) 

{

cout <<"For ile rastgele sayi : " << rand() << " " << endl;

//cout << rand() << " ";

}

return 0;

}


//Örneklerin çıktıları

/*

* ***** rastgele *****

Rastgele uretilen sayi : 5317

*****1 ile 10 arasinda rastgele*****


1 ile 10 arasinda rastgele sayi : 10

*****1 ile 100 arasinda rastgele*****


1 ile 100 arasinda uretilen rastgele sayi : 75

*****Ornek 4 Mulakat sorusu*****


Minimum degeri giriniz : 5

Maximum degerini giriniz : 9

5 ile 9 arasindaki rastgele sayi 9


*****Ornek 5 for dongusu ile rand()*****


For ile rastgele sayi : 29848

For ile rastgele sayi : 30460

For ile rastgele sayi : 21290

For ile rastgele sayi : 8509

For ile rastgele sayi : 10523

*/


/*

int mulakat_Sayi(int max, int min)

{

int mulakat = min + (rand() % (max - min +1));

return mulakat;

}

Konu anlatımı : 


Parça: rand() % (max - min + 1)

rand() fonksiyonu 0 ile 32.767 arasında herhangi bir sayı üretir. Diyelim ki biz 10 ile 15 arasında bir sayı istiyoruz.

Neden max - min + 1 yapıyoruz? Bu bize kaç tane seçeneğimiz olduğunu söyler. 15'ten 10'u çıkarırsan 5 kalır ama 10, 11, 12, 13, 14, 15 toplamda 6 tanedir. İşte o +1 bu yüzden var.

o Hesap: $15 - 10 + 1 = 6$ seçenek.

Neden Modulo (%) alıyoruz? rand() % 6 işlemi, üretilen sayı ne kadar büyük olursa olsun, sonucu mutlaka 0 ile 5 arasında bir değere sabitler. (Çünkü bir sayının 6'ya bölümünden kalan en fazla 5 olabilir).

Parça: min + ...

Şu an elimizde 0, 1, 2, 3, 4, 5 seçeneklerinden biri var. Ama biz 10 ile 15 arası istiyorduk.

Eğer üretilen sayı 0 ise: $10 + 0 = \mathbf{10}$ (Min değer)

Eğer üretilen sayı 5 ise: $10 + 5 = \mathbf{15}$ (Max değer)

Yani en başa eklediğin min, o sıfırdan başlayan sayı dizisini senin istediğin başlangıç noktasına "öteler".


Bir Örnekle Canlandıralım

Senaryo: 20 ile 30 arası bir sayı üretmek istiyoruz. (min=20, max=30)

1. Aralık hesabı: $30 - 20 + 1 = \mathbf{11}$ (Seçenek sayısı)

2. Rand işlemi: Diyelim ki rand() o an bize piyangodan 105 sayısını verdi.

3. Sıkıştırma: $105 \% 11 = \mathbf{6}$ (Çünkü $11 \times 9 = 99$ eder, geriye kalan $6$'dır).

4. Öteleme: $20 + 6 = \mathbf{26}$

Sonuç: 26 (Gerçekten de 20 ile 30 arasında!)


Neden Bu Formülü Kullanıyoruz?

Eğer sadece rand() % 30 yazsaydın, bilgisayar sana 0 ile 29 arası bir sayı verirdi. Ama sen 0'dan değil 20'den başlasın istiyorsun. İşte bu formül, o başlangıç noktasını sağlama almak için tek standart yoldur.

Şimdi bir test yapalım: Eğer 50 ile 60 arası bir sayı üretmek isteseydin, parantez içindeki (max - min + 1) işleminin sonucu kaç çıkardı? (Cevap 11 ise mantığı çözdün demektir!)

*/

Matematikte sayıların sıfır ille bölümünden kalan yine sıfırdır. Sayılar sıfır ile çarpma yada bölme işleminde sonucu sıfır döner

Yazılım kurallarında ise ilk 0 ve 1 döner 

Sıfır ile işlemin sonucunu dönemeyeceğimiz için +1 vererek makine dilinin 0 değerine aslında 1 eklemiş oluyoruz yani aslında +1 sayesinde sonuç dönebiliyoruz.


Bu blogdaki popüler yayınlar

C++ float double string Aritmatik işlemler

  #include <iostream> using namespace std; //void fonk()  //{ // cout << "Merhaba\n"; //} // //int main()  //{ // cout << "Merhaba C++\n"; // // fonk(); // return 0; //} /* int main()  { //Değişkenler rakam ile başlayamaz //Değişken isimlerinde türkçe karakter olmaz //değişken isimleride boşluk olmaz //Değişken isimlerinde nokta vb karakter olmaz //******************************************** //int ram'da 4 byte yer kaplıyor -2147483648 to 2147483647 //char 1 byte  (ASCII tablosu) //bool 1 byte //float 4 byte //double 8 byte //CPU ramdan byte byte okur //Void herhangi bir return etmiyecekse kendi aldığı değerleri kullanır.Bir değer döndürmez. string isim; isim = "Kaan"; int yas; yas = 22; cout << "Bir zamanlar " << isim << " isminde bir genc varmis." << endl << isim << " " << yas << " yasindaymis." ...

C++ try catch, Call by Value, Call by Referans Kullanımı

  #include <iostream> using namespace std; //int main()  //{ // int bolunen, bolen; // cout << "Lutfen bolunen sayiyi giriniz : "; // cin >> bolunen; // cout << "Lutfen bolen sayiyi giriniz : "; // cin >> bolen; // // int sonuc; // // try{ // if (bolen == 0) // throw 99;//Burada throw için herhangi bir tam sayı girilir.örn: negatif sayılar gibi durumlar için çoğaltılabilir // sonuc = bolunen / bolen; // // cout << "Sonuc : " << sonuc; // } // catch(int hataKodu){ // cout << "Bolen sayi sifir olmamali !!" << endl; // } // // cout << endl; // return 0; //} /* try catch Kullanımı :  * try catch kullanıcının beklenmedik bir girdi vermesi sonucu  * programın çökmesini engllemek amacı ile kullanılır * Ayrıca veri tabanı bağlantılarında bağlantının olmaması ve  * işlem sonrasında veri tabanı bağlantısını kapatma veya programın başlangıcında bağlantıyı a...

Pointer ve & (ampersant) Konusunu Kavrayalım

  #include <iostream> #include <string> using namespace std; /* int main()  {  int x = 7; cout << "x 'in degeri : " << x << endl; cout << "x 'in RAM deki adresi : " << &x << endl;  // & ile ramdeki ilk adres değeri  000000D3ED4FFCF4 ni bulduk  // int 4 byte oldugundan bu adresde dahil 4 byte 'lik yerin tamamını hesaplar // ama bize  4 byte lik adresin ilk değerini verir. return 0;  } */ /* int main() { // Pointer  ve & (ampersant) Konusunu Kavrayalım int x = 7; int *p = &x; // pointer ile x 'in adres değerini bulma cout << "x 'in degeri : " << x << endl; cout << "x 'in & ile RAM deki adresi : " << &x << endl; //pointer ile gösterimi cout <<"pointer p ile adres degeri : "<< p << endl; cout << "*p ile ( *p = &x) x in pointer degeri : " <...