C Sharp ile Rasgele Sayı Üretmek

Rasgele Sayı Nedir?

Programlarımızda ürettiğimiz rastgele sayılar gerçek anlamda rastgele sayılmaz. Bir algoritmaya göre üretilmiş sözde rastgele (Pseudo-random) sayılardır. Yani ortada yazılmış bir metot vardır ve bu metot bazı parametrelere göre bir çıktı oluşturur. Bu parametreler aynı ise aynı sonucu elde ederiz. İşin teorisinde durum budur.

Gerçek rastgele sayı herhangi bir şarta bağlı olmadan herhangi bir zamanda oluşan rastgele bir değerdir. Aynı şartlarda aynı sonucu vermemelidir.

Algoritmalar

Bu rastgele sayı üreteçleri ne kadar rastgele birkaç kodu deneyerek bir örnek hazırladım. Gördüğüm o ki bize sadece bir sayı lazımsa biz “.Net deki standart Random Class’ından şaşmayalım.”

Mersenne twister algoritması hızlı çıktı üretiyormuş fakat hep aynı sonuçları veriyor.

Cryptography’nin altındaki classlar byte olarak sonuç üretiyor. Biz bu byteları kullanmak istersek 50 defada 4-5 kez aynı sayıdan 2 tane üretme yapıyor. Ama byteları yan yana getirip daha uzun bi sayı oluşturursak bunlar 50 defada hiç tekrar etmedi.

Öte yandan Random Class’ı da 50 defada hiçbir ek yapmadan aynı sayıyı üretmedi.

Örnek Uygulama

Örnek Visual Studio 2008 ile hazırlandı.

Kodları indirmek için Tıklayınız

Zipli dosyayı açın. Visual Studio da File>Open>Web site yolunu kullanarak extract ettiğiniz klasörü gösterin.

Kodlar


protected void Page_Load(object sender, EventArgs e)
{
//Marsene Twister Random
MT19937 m = new MT19937();

DataTable dt = new DataTable();
dt.Columns.Add("Sayilar");

for (int i = 0; i < 50; i++)
{
dt.Rows.Add(m.genrand_int32().ToString());
}

//Standart Random
Random rnd = new Random();

DataTable dt2 = new DataTable();
dt2.Columns.Add("Sayilar");

for (int j = 0; j < 50; j++)
{
dt2.Rows.Add(rnd.Next().ToString());
}

//Kriptodan Random
RandomNumberGenerator rng = RandomNumberGenerator.Create();

DataTable dt3 = new DataTable();
dt3.Columns.Add("Sayilar");

for (int k = 0; k < 50; k++)
{
byte[] _byt = new byte[4];
//rng.GetBytes(_byt);
rng.GetNonZeroBytes(_byt);
dt3.Rows.Add(BytetanIntYap(_byt).ToString());
}

//Kriptodan Random
RNGCryptoServiceProvider rng2 = new RNGCryptoServiceProvider();

DataTable dt4 = new DataTable();
dt4.Columns.Add("Sayilar");

for (int t = 0; t < 50; t++)
{
byte[] _byt2 = new byte[4];
rng2.GetBytes(_byt2);
dt4.Rows.Add(BytetanIntYap(_byt2).ToString());
}

DataRow[] dr1 = dt.Select("Sayilar is not null", "Sayilar ASC");
DataRow[] dr2 = dt2.Select("Sayilar is not null", "Sayilar ASC");
DataRow[] dr3 = dt3.Select("Sayilar is not null", "Sayilar ASC");
DataRow[] dr4 = dt4.Select("Sayilar is not null", "Sayilar ASC");

for (int s = 0; s < 50; s++)
{
if (s < 49) // dizinin dışına çıkmasın diye
{
EkranaYaz(dr1, s);
Response.Write(" - ");

EkranaYaz(dr2, s);
Response.Write(" - ");

EkranaYaz(dr3, s);
Response.Write(" - ");

EkranaYaz(dr4, s);
Response.Write("
");
}
}
}

private void EkranaYaz(DataRow[] dr3, int s)
{
//a farklı renkte göstersin diye
if (dr3[s][0].ToString() == dr3[s + 1][0].ToString())
{
Response.Write("" + dr3[s][0].ToString() + "");
}
else
{
Response.Write(dr3[s][0].ToString());
}
}

private int BytetanIntYap(byte[] dizi)
{
int iResult = 0;
for (int i = 0; i < 4; i++)
iResult = iResult | ((int)dizi[i] << ((3 - i) * 8));
return iResult;
}

Kullanılan kaynaklar

http://www.memikyanik.com/forumlara/kripto_cs.htm

bilgininadresi.net

http://www.codeproject.com/KB/cs/csharpmersennetwister.aspx

http://qbrundage.com/michaelb/pubs/essays/random_number_generation

Yorum yapabilirsiniz

Adınız  


E-Posta  


Yorumunuz