2017-10-11 78 views
-2

我實現了一種隨機生成自動化字母和數字的方法。隨機數發生器碰撞

public static string GenerateRandomNumber() 
{ 
    using (var rng = RandomNumberGenerator.Create()) 
    { 
     var bytes = new byte[8]; 

     rng.GetBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 
} 

此randomNumberGenerator類會產生碰撞的概率是多少?

+0

很顯然,這會產生在,如果你把它不止一次一些點碰撞......但是不可能給出正確的答案不知道你的隨機數生成器,你想要的結果的數量質量。 –

回答

0

這取決於RandomNumberGenerator的實現,但現在,我在考慮碰撞的概率是100%,因爲您正在爲每個調用實例化一個新實例。如果您使用的是System.Random,則會是這種情況... try it out on DotNetFiddle

public class Program 
{ 
    public static string RandomNumber() 
    { 
     var rng = new System.Random(); 
     var bytes = new byte[8]; 

     rng.NextBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 

    public static void Main() 
    { 
     Console.WriteLine(RandomNumber()); 
     Console.WriteLine(RandomNumber()); 
    } 
} 

輸出(哎呀!):

EgNMBvntr1w= 
EgNMBvntr1w= 

我的建議是,以實例的RandomNumberGenerator只有一個實例,並將其保持在一個靜態變量在整個程序的壽命。如果你這樣做,賠率將更像2^64中的1。

public class Program 
{ 
    private static readonly rng = new System.Random(); 

    public static string RandomNumber() 
    { 
     var bytes = new byte[8]; 

     rng.NextBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 

    public static void Main() 
    { 
     Console.WriteLine(RandomNumber()); 
     Console.WriteLine(RandomNumber()); 
    } 
} 
+0

只是爲了澄清我使用的隨機數生成器屬於System.Security.Criptography.Algorithms命名空間C#語言而不是Sytem.Random() –