C Sharp ile Rastgele Sayı Üretmek

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.

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.

Kaynaklar
memikyanik.com/forumlara/kripto_cs.htm
qbrundage.com/michaelb/pubs/essays/random_number_generation
codeproject.com/KB/cs/csharpmersennetwister.aspx

Visual Studio 2008 ile hazırlandı.
Kodları indirmek için Tıklayınız

Örneğin 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("<br />");
		}
	}
}
 
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("<a href=""deneme"">" 
				 + dr3[s][0].ToString() + "</a>");
	}
	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;
}
Be Sociable, Share!

    Category: Csharp - C# - One comment »

    One Response to “C Sharp ile Rastgele Sayı Üretmek”

    1. CSharp’da List Nesnesinden Rasgele Bir Üye Seçmek - Writing Something

      […] List nesnesinden rasgele bir üye seçmek için kullanılabilecek bir yöntem. Random nesnesi oluşturmadan LINQ ile kolayca listenin üyelerinden herhangi birine […]

    Back to top