Rastgele Sayılar Üretme

Rastgele Sayı Üretme

     Bilgisayar uygulamalarına C standart kütüphanesinde bulunan rand fonksiyonu sayesinde rastgele sayı üretilebilir.

Rand Fonksiyonu

i = rand( );

ifadesine bakalım. rand fonksiyonu 0 ile RAND_MAX ( öncü dosyasında tanımlı bir sembolik sabit) değeri arasında bir tamsayı yaratır. ANSI standartlarına göre RAND_MAX, iki byte (16 bit) tamsayıların alabileceği en büyük değer olan 32767’den küçük olamaz. Bu kısımdaki programlar, RAND_MAX değeri en çok 32767 olan bir sistem için yazılmıştır.

rand( )%6

0 ile 5 dizisindeki (0,1,2,3,4,5) tamsayılar üretilecektir.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main( )
  4. {
  5. int i;
  6. for ( i = 1; i <= 20; i++ )
  7. {
  8. printf( "%10d", 1 + ( rand( ) % 6 ) );
  9. if ( i % 5 == 0 )
  10. printf( "\n" );
  11. }
  12. return 0;
  13. }
  14.  

     Bu sayıların yaklaşık olarak eşit ihtimalle ortaya çıktıklarını göstermek için, aşağıda zarın 6000 kez atılmasını inceleyelim. 1’den 6’ya kadar tüm tamsayılar yaklaşık olarak 1000 kez zarın üstüne gelmelidir.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main( )
  4. {
  5. int yuz, atis, frekans1 = 0, frekans2 = 0,
  6. frekans3 = 0, frekans4= 0,frekans5= 0, frekans6= 0;
  7. for ( atis = 1; atis <= 6000; atis++ )
  8. {
  9. yuz = 1 + rand() % 6;
  10. switch ( yuz )
  11. {
  12. case 1: ++frekans1;
  13. break;
  14. case 2: ++frekans2;
  15. break;
  16. case 3: ++frekans3;
  17. break;
  18. case 4: ++frekans4;
  19. break;
  20. case 5: ++frekans5;
  21. break;
  22. case 6: ++frekans6;
  23. break;
  24. }
  25. }
  26. printf( "%s%13s\n", "Yuz", "Frekans" );
  27. printf( "1%15d\n", frekans1 );
  28. printf( "2%15d\n", frekans2 );
  29. printf( "3%15d\n", frekans3 );
  30. printf( "4%15d\n", frekans4 );
  31. printf( "5%15d\n", frekans5 );
  32. printf( "6%15d\n", frekans6 );
  33. return 0;
  34. }

Derecelendirme ve kaydırma ile rand fonksiyonunun 6 yüzlü bir zarın atışını gerçekçi bir biçimde gerçeklemesini sağlattık.
Rand Program Çıktısı
İlk yazılan program tekrar çalıştırıldığında yukarıda ki çıktıyı elde ederiz. Dikkat edildiği üzere ilk çıktı ile aynı çıktıyı üretti.Öyleyse bu sayılar nasıl rasgele sayılar olabilir? Bu tekrar, rand fonksiyonunun önemli bir özelliğidir. Bir programın hatası ayıklanırken, bu tekrar programda yapılan düzeltmelerin doğru bir biçimde çalıştığını kanıtlamak için önemlidir. Program her çalıştırıldığında kendini tekrar etmektedir.

Srand Fonksiyonu

     Bu fonksiyonu, unsigned tipte bir tamsayıyı argüman olarak kullanır ve rand fonksiyonunu besleyerek, programın her çalıştırılışında farklı bir dizide rasgele sayılar oluşturulmasını sağlar.

     srand fonksiyonu, unsigned bir değeri argüman olarak alır. %u
dönüşüm belirteci, scanf ile unsigned bir değeri okumakta kullanılır. srand fonksiyonunun prototipi içinde bulunur.

  1. #include<stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6. int i; unsigned besleme;
  7. printf("Besleme Giriniz");
  8. scanf("%u",&besleme);
  9.  
  10. srand(besleme);
  11.  
  12. for(i=1; i<=10; i++)
  13. {
  14. printf("%10d",1+(rand()%6));
  15. if(i%5==0)
  16. printf("\n");
  17. }
  18. return 0;
  19. }

Program her çalıştırıldığında ve farklı bir besleme sağlandığında, farklı bir dizide rastgele sayılar oluşturulduğuna dikkat ediniz.  Her seferinde besleme girmeden rasgele hale getirmek istiyorsak, aşağıdaki gibi bir ifade kullanabiliriz:

srand ( time ( NULL ) );

Bilgisayarın besleme değeri olarak otomatik bir biçimde kendi saatini okumasına sebep olur. time fonksiyonu, o andaki saati saniye biçiminde oluşturur. Bu değer, unsigned bir tamsayıya dönüştürülür ve rasgele sayı üretiminde besleme olarak kullanılır. time fonksiyonu argüman olarak NULL kullanır. time fonksiyonunun prototipi içindedir.

rand ile elde edilen değerler her zaman 0 ≤ rand( ) ≤ RAND_MAX aralığındadır.

yuz =1 + rand ( ) % 6;

yuz değişkenine 1 ≤ yuz ≤ 6 aralığından rasgele olarak bir tamsayı atar.

Genel kullanım ifadesi :

n = a + rand ( ) % b;

a, kaydırma değeri (aralığın başlangıç değeri ) b ise derecelendirme faktörüdür. (aralığın genişliğidir)

Zar Oyunu Yapalım

     Zarın iki  zar atılır ve gelen sayıların toplamı 5 ise oyuncu kazanır.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int ZarAt( void);
  6.  
  7. int main()
  8. {
  9. int Durum , ToplamPuan, OyuncuPuani;
  10.  
  11. srand(time(NULL));
  12.  
  13. ToplamPuan=ZarAt();
  14.  
  15. if(ToplamPuan==7|| ToplamPuan==11)
  16. Durum=1;
  17. else if (ToplamPuan==2||ToplamPuan==3||ToplamPuan==12)
  18. Durum=2;
  19. else
  20. {
  21. Durum=0;
  22. OyuncuPuani=ToplamPuan;
  23. printf("\nKazanacagiz Paun: %d\n\n",OyuncuPuani);
  24. }
  25. while(Durum==0)
  26. {
  27. ToplamPuan=ZarAt();
  28.  
  29. if(ToplamPuan==OyuncuPuani)
  30. Durum=1;
  31. else if(ToplamPuan==2);
  32. }
  33.  
  34. if(Durum==1)
  35. printf("\n **Kazandiniz** \n");
  36. else
  37. printf("Kaybettiniz \n");
  38. return 0;
  39. }
  40. int ZarAt( void)
  41. {
  42. int z1,z2,tz;
  43.  
  44. z1=(1+rand()%6);
  45. z2=(1+rand()%6);
  46.  
  47. tz=z1+z2;
  48.  
  49. printf("%3.d + %1.d = %5.d attiniz \n",z1,z2,tz);
  50. return tz;
  51. }

Kimler Neler Demiş?

  Abone ol  
Bildir