2016-10-10 14 views
2

私はC#を初めて使用しています。同じ関数を3回呼び出してランダムなスティングを返すコードがあります。なんらかの理由で、私のコードは常に同じ文字列を返しています。助けてください。ランダムな文字列を返す関数と同じ結果を見る

 public static String randomString() 
    { 
     String chars = "QWERTYUIOPASDFGHJKLZXCVBNM"; 
     Random rand = new Random(); 
     String finalstring = null; 

     for (int i = 0; i < 8; i++) 
     { 
      finalstring += chars[rand.Next(0, chars.Length - 1)]; 

     } 
     return finalstring; 

    } 

    public void SecondTest() 
    { 

     Console.WriteLine(Class1.randomString()); 
     Console.WriteLine(Class1.randomString()); 
     Console.WriteLine(Class1.randomString()); 

    } 

サンプル出力の観測: AXCFSDRG AXCFSDRG AXCFSDRG

+0

メインクラスでランダムに作成します。密接に作成すると、同じ結果が得られます。また、質問をする前にgoogleを使ってみてください。 – deathismyfriend

答えて

1

あなたは3つの別々のランダムなオブジェクトを構築するのではなく、(より良い練習になります)、単一のランダムなオブジェクトを再利用しています。

シードを提供していない場合は、ランダムオブジェクトには現在の時間が設定されます。この場合、randomString()メソッドは非常に高速に戻り、3つのRandomオブジェクトすべてが同じシードを取得し、同じ出力シーケンスを取得します。

1

これに基づいてSO Answer

新しいRandom()を実行するたびに、時計を使用して初期化されます。この は、タイトなループで同じ価値を何度も得ることを意味します。 は、1つのランダムインスタンスを保持し、同じ インスタンスで次を使用し続ける必要があります。

//Function to get random number 
private static readonly Random random = new Random(); 
private static readonly object syncLock = new object(); 
public static int RandomNumber(int min, int max) 
{ 
    lock(syncLock) { // synchronize 
     return random.Next(min, max); 
    } 
} 
+1

VTCを複製すると、既存の回答をコピー貼り付けるよりも適切です。 –

-1

使用RNGCryptoServiceProviderクラス:RNGCryptoServiceProvider: generate random numbers in the range [0, randomMax)

https://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx

ルックあなたは答えに拡張メソッドを使用して、次の場合:

public static String randomString() 
    { 
     String chars = "QWERTYUIOPASDFGHJKLZXCVBNM"; 
     Random rand = new Random(); 
     String finalstring = null; 

     for (int i = 0; i < 8; i++) 
     { 
      finalstring += chars[GenerateRandomNumber(8)]; 

     } 
     return finalstring; 

    } 

    public static int GenerateRandomNumber(int length) 
    { 
     using (var randomNumberGenerator = new RNGCryptoServiceProvider()) 
     { 
      return randomNumberGenerator.GetNextInt32(length); 
     } 
    } 

結果は毎回異なるでしょう。

関連する問題