SORU
19 AĞUSTOS 2014, Salı


.NET Çerçeve: Rastgele sayı üreteci üretir desen yinelenen

EDİT: Bu olmayan bir yinelenen ve rastgele bir sayı kullanmak yanlış anlaşılma naif bir jeneratör bir sonuç değil. Teşekkürler.

Sayıları Sistem tarafından oluşturulan yinelenen desen keşfetmiş gibiyim.Random sınıfı. Bir "usta" Rasgele örneği "ana" örnek Rastgele. bir an için bir tohum üretmek için kullanıyorum Değerleri bu ana Rasgele örnek yinelenen bir desen sergileyen tarafından üretilen. Özellikle, 3. sayıda üretilen çok tahmin edilebilir.

Aşağıdaki program sorunu gösterir. Farklı bir tohum değeri döngü her zaman kullanıldığını unutmayın.

using System;

class Program
{
    static void Main(string[] args)
    {
            // repeat experiment with different master RNGs
        for (int iMaster = 0; iMaster < 30;   iMaster)
        {
                // create master RNG
            var rngMaster = new Random(iMaster   OFFSET);

                // obtain seed from master RNG
            var seed = rngMaster.Next();

                // create main RNG from seed
            var rngMain = new Random(seed);

                // print 3rd number generated by main RNG
            var ignore0 = rngMain.Next(LIMIT);
            var ignore1 = rngMain.Next(LIMIT);
            var randomNumber = rngMain.Next(LIMIT);
            Console.WriteLine(randomNumber);
        }
    }

    const int OFFSET = 0;
    const int LIMIT = 200;
}

Bu rastgele çıktı üretmek gerektiğini düşünüyorum, ama kutudan çıktı gerçek

84
84
84
84
84
84
84
84
84
84
84
...

Herkes burada neler olduğunu açıklayabilir mi? OFFSET ve LİMİT sabitleri değişen çıkış değeri değişir, ama her zaman tekrar ediyor.

CEVAP
19 AĞUSTOS 2014, Salı


Sigara şifreleme açısından güçlü RNGs dünyasına hoş geldiniz. Görünüşe göre inşa edilmiş .NET bölgede de yapalım eğer 84 çıkışları 3 numaralı çıkış için 0 200 sınırı yapmak için bir eğilim vardır. Programın şu versiyonu bir göz atın, çıkış içinde neler olduğunu daha çok gösterir.

class Program
{
    static void Main(string[] args)
    {
        Console.WindowWidth = 44;
        Console.WindowHeight = 33;
        Console.BufferWidth = Console.WindowWidth;
        Console.BufferHeight = Console.WindowHeight;

        string template = "|{0,-5}|{1,-11}|{2,-5}|{3,-5}|{4,-5}|{5,-5}|";
        Console.WriteLine(template, "s1", "s2", "out1", "out2", "out3", "out4");
        Console.WriteLine(template, new String('-', 5), new String('-', 11), new String('-', 5), new String('-', 5), new String('-', 5), new String('-', 5));

        // repeat experiment with different master RNGs
        for (int iMaster = 0; iMaster < 30;   iMaster)
        {
            int s1 = iMaster   OFFSET;
            // create master RNG
            var rngMaster = new Random(s1);

            // obtain seed from master RNG
            var s2 = rngMaster.Next();

            // create main RNG from seed
            var rngMain = new Random(s2);

            var out1 = rngMain.Next(LIMIT);
            var out2 = rngMain.Next(LIMIT);
            var out3 = rngMain.Next(LIMIT);
            var out4 = rngMain.Next(LIMIT);
            Console.WriteLine(template, s1, s2, out1, out2, out3, out4);
        }

        Console.ReadLine();
    }

    const int OFFSET = 0;
    const int LIMIT = 200;
}

Burada çıktı

|s1   |s2         |out1 |out2 |out3 |out4 |
|-----|-----------|-----|-----|-----|-----|
|0    |1559595546 |170  |184  |84   |84   |
|1    |534011718  |56   |177  |84   |123  |
|2    |1655911537 |142  |171  |84   |161  |
|3    |630327709  |28   |164  |84   |199  |
|4    |1752227528 |114  |157  |84   |37   |
|5    |726643700  |0    |150  |84   |75   |
|6    |1848543519 |86   |143  |84   |113  |
|7    |822959691  |172  |136  |84   |151  |
|8    |1944859510 |58   |129  |84   |189  |
|9    |919275682  |144  |122  |84   |28   |
|10   |2041175501 |30   |115  |84   |66   |
|11   |1015591673 |116  |108  |84   |104  |
|12   |2137491492 |2    |102  |84   |142  |
|13   |1111907664 |88   |95   |84   |180  |
|14   |86323836   |174  |88   |84   |18   |
|15   |1208223655 |60   |81   |84   |56   |
|16   |182639827  |146  |74   |84   |94   |
|17   |1304539646 |31   |67   |84   |133  |
|18   |278955818  |117  |60   |84   |171  |
|19   |1400855637 |3    |53   |84   |9    |
|20   |375271809  |89   |46   |84   |47   |
|21   |1497171628 |175  |40   |84   |85   |
|22   |471587800  |61   |33   |84   |123  |
|23   |1593487619 |147  |26   |84   |161  |
|24   |567903791  |33   |19   |84   |199  |
|25   |1689803610 |119  |12   |84   |38   |
|26   |664219782  |5    |5    |84   |76   |
|27   |1786119601 |91   |198  |84   |114  |
|28   |760535773  |177  |191  |84   |152  |
|29   |1882435592 |63   |184  |84   |190  |

Ana RND ilk çıkış ve zincirleme off ilk olan ikinci bir bölgede de yapalım ilk birkaç çıktıları arasında güçlü bir korelasyon vardır. Random o bölgede de yapalım"", işler burada gördüğünüz gibi, hızlı ve güvenli olmak arasında. bileşimleri "hızlı olacak şekilde tasarlanmıştır "güvenli olması için tasarlanmamış Eğer böyle şeylerin olmasını istemiyorsan eğer ... cryptographicly güvenli bir rastgele sayı üreteci kullanmak gerekir.

Ancak sadece Jeneratör (CRNG) yeterli bir Şifreleme Rasgele Sayı geçiş hala CRNG kullanmak nasıl dikkatli olmak gerekir. Çok benzer bir sorun, kablosuz güvenlik WEP ile oldu. IV başlığında verildi ne bağlı olarak tohum değeri (WEP anahtarı) rastgele sayı üreteci bağlantı korumak için kullanılan ne olduğunu tahmin etmek mümkün oldu. Bir CRNG (RC4 kullandılar) kullanılmasına rağmen doğru (çıkışı olmayan tahmin edilebilir hale gelmeden önce bir kaç 1000 yineleme tükürmek için kullanmıyorlar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DominicFear

    DominicFear

    30 Kasım 2006
  • mist64

    mist64

    30 Mayıs 2006
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006