C# ta RANDOM CLASSI ile HER SEFERINDE FARKLI SAYI ÜRETMEK

Bu makalemizde C# dilinde random classi üzerinde duracagim. Ayrica üretmek istedigimiz sayilarin her seferinde farkli olmasi için diziler yapisini kullanarak örnegimiz üzerinde gösterecegim.
Buradan anlasilacagi gibi random ile her seferinde rastgele sayi üretmek istedigimizde bize ardi ardina ayni sayiyi verebiliyormus. Bunun önüne geçebilmek için ben örnegimde dizi mantigini kullandim. Sizler Arraylist gibi diger yapilari da kullanabilirsiniz. Böylelikle hem random classinin nasil kullanildigini ögrenmis olacagiz hem de program içinde nasil kullanildiklarini görecegiz.
RANDOM CLASSI
Random classi C# ve diger programlama dillerinde oldugu gibi rastgele sayi üretmek için kullanilirlar ama her dilde kullanilis biçimi farkli olabilir. Biz C# ta nasil kullanildiklarini örnek üzerinde göstermis olacagiz. Random her seferinde sadece 1 tane rastgele sayi üretir. Onun disinda istedigimiz kadar üretmesini istiyorsak bir döngünün içine sokmamiz yeterli olacaktir.
1-      C# ta random bir class oldugu için öncelikle yavru degisken tanimlamasi yaparak o classi çagiracagiz.
2-      Daha sonra next komutuyla rastgele sayilar üretmeye baslayacagiz.
random-classi-kullanimi-ve-random-ile-her-sefeind-1

random-classi-kullanimi-ve-random-ile-her-sefeind-1

Görüldügü gibi overload yapilmis ve Next metodunu 3 farkli sekilde kullanmamiza olanak getirmistir. Simdi bunlari inceleyelim.
Random rand = new Random(); //Yavru degisken olusturduk.
Rand.Next();
             Yukaridaki kod blogu bize int türünde yuksek  basamakli sayi üretir.
Random rand = new Random();
Rand.Next(50); //int türünde max bir deger girecegiz.
             Yukaridaki kod blogu bize (0-50) arasi sayi üretir.
Random rand = new Random();
Rand.Next(20,100); //min degeri ve max degeri int türünde girecegiz.
             Yukaridaki kod blogu bize (20-100) arasi sayi üretir. (20 dahil 100 dahil degil)
Ayrica NextDouble metodu vardir;
Random rand = new Random();
Rand.NextDouble(); // *10 dersek (0-10) arasi ondalikli sayi üretir.
             Yukaridaki kod blogu bize (0-1) arasinda ondalikli sayi üretir.
Random clasinin nasil kullanildigini ögrenmis olduk. Simdi de randomu bir program içerinde kullanillanalim. Amacimiz, (1-20 dahil) arasinda birbirinden farkli 10 adet sayi üretmek ve bunu listboxta gostermek olsun. Normal sartlarda (1-20) arasinda 10 tane rastgele sayi üretirsek asagidaki gibi ayni sayiyi verme olasiligi vardir.
random-classi-kullanimi-ve-random-ile-her-sefeind-2

random-classi-kullanimi-ve-random-ile-her-sefeind-2

  Ben bunun önüne geçmek için tüm sayilari tek tek bir diziye aktardim ve yeni üretilen diger bir sayiyi kendilerinden öncekilerle karsilastirdim, o sayi var ise tekrar yeni bir sayi üretmesini istedim, yoksa o sayiyi diziye aktarmasini sagladim. Sonunda da dizideki tüm elemanlari listboxa aktardim.
private void button1_Click(object sender, EventArgs e)
        {
            Random yeni = new Random(); //1
            listBox1.Items.Clear(); //2
            int RastgeleSayi=yeni.Next(1, 21); //3
            int [] FarkliSayilariTut = new int[10]; //4
            FarkliSayilariTut[0] = RastgeleSayi; //5
            for (int i = 1; i < FarkliSayilariTut.Length; i++) //6
            {
                RastgeleSayi = yeni.Next(1,21); //7
                for (int j = 0; j < i; j++) //8
                {
                    if (FarkliSayilariTut[j] == RastgeleSayi) //9
                    {
                       i–;  //10
                        break; //11
                    }
                    else
                    {
                        FarkliSayilariTut[i] = RastgeleSayi;  //12
                    }
                }
            }
            for (int i = 0; i < 10; i++)
            {
                listBox1.Items.Add(FarkliSayilariTut[i].ToString()); //13
            }
        }
 
Kodlarimizi inceleyelim ve neyi neden kullandigimizi belirtelim.
//1 – Random classini kullanabilmem için yeni adinda bir yavru degisken olusturdum.
//2– Her butona bastigimda listboxu temizlemesini istedim.
//3– (1-20 dahil) arasinda bir sayi üretmesini istiyorum ve bunu RastgeleSayi adinda bir degiskende tutuyorum
//4– int türünde bir dizi tanimladim. 10 adet sayi üretecegim için eleman sayisini 10 olarak belirledim.
//5– Dizinin 0. Elemanina rastgele bir sayi atadim. Bunu neden dongü içerisinde degilde burada yaptigima deginecegim.
//6– 1 den baslayan ve 9 a kadar devam eden bir for dongüsü tasarladim. 1 den baslamamin nedeni dizinin 0. Elemanina zaten bir deger atadigimdi.
//7– Bu kez döngümün içinde (1-20) arasi rastgele sayi ürettim ve bunu degiskenime atadim.
//8– Bu for döngüsünü ise diziye o ana kadar atilan sayilari gezebilmem için tasarladim.
//9– Diziye atilan tüm elemanlari tek tek geziyorum ve eger yeni üretilen sayi diziye daha -önce atilmissa asagidaki islemleri yaptiriyorum.
//10–  i sayisini bir azaltarak ayni attigi sayiyi degistirebilme imkani veriyorum.
//11– Ayni sayiyi buldugumuz için artik döngüyü devam ettirmesinin bir anlami yok ve asagidaki kod satirlarina bakmasini istemiyorum ve içinde bulundugu for dongusunu break komutuyla bitiriyorum.
//12– Eger yeni üretilen sayi daha önce üretilenlere esit degilse onu dizimize aktariyoruz.
Not: Simdi gelelim neden dizinin 0. Elemanina sayiyi, döngüde degil de daha önce attik. Döngüde atsaydik  i  yi 0 dan baslatmamiz gerekirdi ve bu durumda 2. Döngüdeki  j de 0 dan basladigi için  j < i  sartina uymayacakti ve döngüye hiç girmeyecegi için dizinin 0. Elemanina her zaman için 0 sayisini atayacakti. Bunun önüne geçebilmek için döngüde degil de daha önce atamasini yaptik.
                //13– Tekrar bir for döngüsüyle dizideki tüm elemanlari listboxa aktardik.
Sonuca bakalim ve 10 tane farkli farkli sayi ürettigini görelim.
random-classi-kullanimi-ve-random-ile-her-sefeind-3

random-classi-kullanimi-ve-random-ile-her-sefeind-3

Sizde bu örnegi bir çok yolla yapabilirsiniz. Farkli farkli algoritmalar kurup ayni sonuca ulasabilirsiniz. Benim kurdugum diger bir algoritma ise asagidaki gibidir. Yine ayni isi yapan farkli bir yaklasim. Farkli bir algoritma. Yukarida kurdugumuz algoritma bu algoritmaya göre daha sagliklidir.
Random  rastgelesayiuret = new Random();
int [] SayiDizisi=new int[10];
          for (int i = 0; i < SayiDizisi.Length; i++)
          {
              int Sayi = rastgelesayiuret.Next(1,21);
              if (i == 0)
              {
                 SayiDizisi[i] = Sayi;
              }
            git:
             for (int j = 0; j < i; j++)
             {
                 if (Sayi == SayiDizisi[j])
                 {
                     i–;
                     goto git;
                 }
             }
             SayiDizisi[i] = Sayi;
          }
            for (int i = 0; i < SayiDizisi.Length; i++)
            {
                listBox1.Items.Add(SayiDizisi[i]);
            }
Bu örnegimizi mesela, bir asp.net projesinde anasayfanizda her açilista rastgele 10 makale yer almasini istiyorsunuz, tabiki ayni makalenin 2 defa görüntülenmemesi gerektigi için bu örnedgimizi kullanabilirsiniz.
Iyi Çalismalar….