random number generation(rastgele sayi uretimi)

Rastgele sayi uretimi denildiginde buradaki en onemli kavram ==ongorulebilirliktir==. Eger ongorulebilirlik ne kadar azsa ancak o zaman random sayidan bahsedilebilir. Ornegin ardisik artan bir dizide 1,2,3,4,5 burada herhangi bir random sayidan bahsedemeyiz cunku ardisik bir artis oldugu ongorulebilirdir.

![[Pasted image 20231116160755.png]]

Random number generation’i biz iki kategoriye ayiririz;

  1. true(ly) random number generation Dogadan kaynaklanan ongorulemezligi yuksek ve tekrar uretimi olmayacak sekilde bir uretim varsa bu truely random generatordur. Orn; elimizde atmosferdeki gurultuyu algilayan bir cihaz olsun ve bunu rastgele sayilara donustursun bunun ongorulemezligi yuksek ve tekrar uretimi cok zordur. Iste bu yolla rastgele sayi uretmek daha yavastir, cunku her zaman external bir cihazla iletisime gecmek zorundayizdir. Bu kategori ==non-deterministictir==.

  2. pseudo random generation ilk kategoriye gore cok daha hizli bir uretim vardir ve deterministictir. Cunku hangi inputla beslersek ona yonelik output aliriz. Su an endustride en cok kullanilan pseudo random generation algoritmasi ==mersenne twister algoritmasi==’dir. Bircok random generate algoritmasinin olmasinin sebebi rastgele uretimi kalite olarak niteleyebilecek neredeyse 10’a yakin parametre olmasindan kaynaklanir. Orn; Hiz, islem sayisi, ongorulemezlik etc. Eger rastgele sayi uretimi ==trivial== bir is icin kullanilacaksa efficiency o kadar da onemli degildir.

!!! Dikkat: ==uniform random number generator== ile ==distribution== birbirlerinden cok farklidir. Programcilarin karistirdigi onemli noktalardan birisidir.

==Uniform random number generator== aslinda rastgele bir bit kaynagi olusturmaktadir, orn; 10001010010100010100101010100101010 gibi rastgele bir bit kaynagi olsun ama bu rastgele bit kaynaginin ne amacla kullanilacagina yonelik kod uretmek cok daha farklidir buna da ==distribution== denir. Diyelim bir uygulamada 1-10 arasinda rastgele bir sayi uretmek istiyorsak bu tamamen distribution ile ilgilidir. Yani anlamsiz uretilen bit kaynagi boyle bir amacla kullanilamaz.

Distribution islemi icinse bircok matematiksel islem kullanilabilir; Orn: ==uniform distribution==(kumedeki her deger icin olasilik fonksiyonun birbirine yakinsamasi demektir) Bkz: (==probability distribution==)

[!note] C standart kutuphanesinin araclari rastgele sayi uretiminin onemli oldugu alanlarda kullanmak icin yetersizdir. Onerilmez.

C dilinde rastgele sayi uretimi icin baslik dosyasinda bildirilmis olan rand(), srand() fonksiyonlari kullanilabilir.

Hangi rastgele sayi uretim algoritmasini kullanirsaniz kullanin deterministik yapidadir. Hangi inputu verirsek o outputu aliriz. Bu tarz algoritmalarda kullanilan input degerine ==seed value== denir. Her seed value icin uretilen rastgele sayi zinciri vardir.

==int rand(void);==

Bu fonksiyon cagrildigi zaman 0 ile RAND_MAX(makro) arasinda bir sayi uretir ve default seed value’si 1’dir.

Eger biz belirli bir seed value kullanarak rastgele sayi zinciri elde etmek istiyorsak bu kez kullanacagimiz fonksiyon;

==void srand(unsigned int);==’dir.


Peki program her calistiginda farkli bir sayi zinciri uretimini nasil saglariz?

Yanlis yol -> srand(rand());

Bu kod yanlistir cunku rand()’in seed value’si default 1’dir dolayisiyla srand’in urettigi sayi zinciri yine ayni olacak. Burada anlamamiz gereken nokta o zaman sudur;

srand() fonksiyonuna parametre olarak oyle bir sey vermeliyim ki o parametre surekli ==true random number generate== edebilsin.

Iste bilgisayarda true random number generation icin isletim sistemi external cihazlarin verilerini(cpu sicakligi, klavyeye girilen degerler arasindaki sure farklari vs) isleyerek bir rastgele sayi uretimi yapar.

Bunun icin C dilinde baslik dosyasini kullanabiliriz. Bu baslik dosyasinda bildirilen bir time isminde bir fonksiyon vardir bu fonksiyon orijin noktasi olarak epoch time kullanir. ![[Pasted image 20231116201344.png]]

![[Pasted image 20231116195703.png]] Iste bu kod ile program her calistirildiginda farkli random sayilar elde edebiliriz. Cok sik kullanilan idiyomdur.

(nutility.h dosyasina belli bir aralikta random sayi ureten makro tanimi yaptik koda bakilabilir.)

![[Pasted image 20231117135009.png]] #review C mulakatlarinda cok gelen tipik sorulardan biridir, rand() fonksiyonunu kullanarak standart outputa harf karakterlerini yazdiririz. % 26 kullanmamizin sebebi 26 tane harf karakterinin olmasidir. % 26 aldigimizda matemetikte Kalan < Bolen kaidesinden dolayi islem sonucu surekli 26’dan kucuk degerler uretecek, buna ‘A’ nin ASCII’deki karakter kodunu ekleriz ve random harfleri elde ederiz.

![[Pasted image 20231117154533.png]] #review Bu kodda randomize() fonksiyonunu main fonksiyonunda cagirsaydik 10 tane farkli parola uretiyor ama print_random_psw icine koydugumuzda 10 tane ayni parolayi outputa yaziyor neden?

Cevap: Dongu o kadar hizli calisiyor ki 1 saniye gecmeden dongu turunu tamamliyor dolayisiyla ayni seed value ile islem yapiliyor. Bu nedenle tipik olarak randomize() fonksiyonu main icerisinde cagrilmalidir.


Rastgele sayi uretiminin kullanildigi tipik temalar

![[Pasted image 20231117160528.png]] Yazi-Tura oyununda olasilik hesaplayan kod parcasi

#include "nutility.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NGAMES 10000000
#define HEADS 1

int roll_dice(void) {
  int dice1 = rand() % 6 + 1;
  int dice2 = rand() % 6 + 1;

  return dice1 + dice2;
}

int game_(int dice) {
  for (;;) {
    int newDice = roll_dice();
    if (newDice == dice)
      return 1;
    if (newDice == 7)
      return 0;
  }
}

// returns 1 if player wins
// returns 0 if player loses
int game(void) {

  int dice = roll_dice();

  switch (dice) {
  case 7:
  case 11:
    return 1;
  case 2:
  case 3:
  case 12:
    return 0;
  default:
    return game_(dice);
  }
}

int main(void) {
  int winCount = 0;

  for (int i = 0; i < NGAMES; ++i) {

    winCount += game();
  }

  printf("probability of winning = %.12f\n", (double)winCount / NGAMES);
}

Craps(Barbut) Casino oyununu simulate eden kod parcasi.