Rastgele Sayı Üretimi

Random sınıfını kullanarak rastgele sayı üretimi

Rastgele Sayı Üretimi

Programlarımızda zaman zaman rastgele bir sayı bilgisi kullanmamız gerekir. Bunun için .Net le beraber gelen Random sınıfını kullanabiliriz. Bunda hiçbir sakınca yok. :)

Random rnd = new Random();
Console.WriteLine(rnd.Next());

Ama bu yazının amacı bu işi daha sağlama alarak nasıl yapabilirizi göstermek. Random sınıfının 2 kurucusu (constructor) var. Yukarıda ilkini kullandık. Diğeri de şu şekilde kullanılıyor:

Random rnd = new Random(1000);
Console.WriteLine(rnd.Next());

Parantez içerisinde verilen parametre ile sayı üreticini daha da karmaşıklaştırabiliyoruz. Ayrıntılı bilgi isteyenler buraya bakabilirler.

Biz bu işi bir adım daha ileriye taşımak istersek, parantez içerisinde sabit bir sayı değil de değişken bir bilgi kullanabiliriz.

int seed = DateTime.Now.Millisecond;
Random rnd = new Random(seed);
Console.WriteLine(rnd.Next());

Random sınıfı ile bu işi daha da ileriye taşıyamayız. Hepsi bu kadar. Ama işi daha da garantileştirmek daha da profesyonel hale getirmek istersek ne yapmalıyız? (Yazımızın bundan sonrası ileri seviye kullanıcılar içindir.)

Daha önce hiç RNGCryptoServiceProvider adında bir sınıf duymuş muydunuz? Bu arkadaşımız RandomNumberGenerator sınıfından türemiştir ve bu sınıftan başka bir sınıf türetemezsiniz.

Bu sınıf yardımıyla biz rastgele sayı işini oldukça rastgeleleştirebiliriz. :)

Aslında burada amacımız, Random sınıfına güzel bir paremetre verebilmek. (Yukarıdaki seed paremetresine benzer)

Lütfen kodu inceleyiniz:

byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);

int seed = 
  (randomBytes[0] & 0x7f) << 24 |
  randomBytes[1] << 16 |
  randomBytes[2] << 8 |
  randomBytes[3];

Random random = new Random(seed);
Console.WriteLine(rnd.Next());

4 baytlık güzel bir seed bilgisi üretmek için  RNGCryptoServiceProvider sınıfını kullandık. int tipindeki değişkenler biliyorsunuz 4 baytlık bilgi saklayabilir. Biz bu 4 baytlık bilgiyi ayrı ayrı güzelce doldurduk.

| operatörünün bit bazında veya işlemi, <<  operatörünün yine bit bazında sola kaydırma işlemi yaptığını hatırlatmak isterim.

Herkese kolay gelsin.

Not: Daha önceden GUID ile rasgele metin oluşturma başlıklı bir yazı eklemiştim. İlgilenen arkadaşlara hatırlatmak isterim.