.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
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.
<rastgele> Linux içinde aynı say...
Tek bir rastgele sayı üretme rastgele ...
Nasıl bir TSQL Seçin her satır için ra...
C şamandıra rastgele sayı üretimi...
Aralığında rastgele bir sayı üretmek 1...