2017-10-11 8 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のインスタンスを1つだけインスタンス化し、プログラムの寿命を通じて静的変数に保持することです。あなたがそうするならば、確率は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()ではない乱数ジェネレータを使用しています。 –