C Sharp ile Rastgele Sayı Üretmek

02 Nisan 2008 Çarşamba


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
http://www.memikyanik.com/forumlara/kripto_cs.htm
http://qbrundage.com/michaelb/pubs/essays/random_number_generation
http://www.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;
    }        


Yorumlar


İsim
E-mail
Yorum
Gönder
Arama

   
Ara
Rasgele Yazı
Hüseyinli - Tepecik Yürüyüşü

Doğagezginleri ile yapılmış güzel bir etkinlik anısı...

Devamını Oku
Excel Videoları

Excel E-Learning