2009-06-10 29 views
4

我發現這個代碼的snippet生成一串隨機字符。這是一個生成一串隨機字符的好方法嗎?

但是,有沒有更優雅/更快/更可靠的方法來做到這一點?這似乎依賴於數字26-91是給定當前編碼的有效字符的事實。

/// <summary> 
/// Generates a random string with the given length 
/// </summary> 
/// <param name="size">Size of the string</param> 
/// <param name="lowerCase">If true, generate lowercase string</param> 
/// <returns>Random string</returns> 
private string RandomString(int size, bool lowerCase) 
{ 
    StringBuilder builder = new StringBuilder(); 
    Random random = new Random(); 
    char ch; 

    for(int i = 0; i < size; i++) 
    { 
     ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); 
     builder.Append(ch); 
    } 

    if(lowerCase) 
     return builder.ToString().ToLower(); 

    return builder.ToString(); 
} 
+1

它不依賴於當前的編碼 - Convert.ToChar *總是*使用Unicode,不管系統默認編碼。它在很多其他方面雖然很難看,但:) :) – 2009-06-10 16:26:41

回答

21

我寧願到Random實例傳遞到方法 - 那麼你可以多次,如果你需要產生大量的快速連續隨機字符串這是非常重要重複使用相同的實例。不過,我也想修改它有點反正:

public const string LowerCaseAlphabet = "abcdefghijklmnopqrstuvwyxz"; 
public const string UpperCaseAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

public static string GenerateUpperCaseString(int size, Random rng) 
{ 
    return GenerateString(size, rng, UpperCaseAlphabet); 
} 

public static string GenerateLowerCaseString(int size, Random rng) 
{ 
    return GenerateString(size, rng, LowerCaseAlphabet); 
} 

public static string GenerateString(int size, Random rng, string alphabet) 
{ 
    char[] chars = new char[size]; 
    for (int i=0; i < size; i++) 
    { 
     chars[i] = alphabet[rng.Next(alphabet.Length)]; 
    } 
    return new string(chars); 
} 
  • 有沒有必要使用StringBuilder,當你知道最終長度
  • 使用Random.NextDouble()表明缺乏Random類的知識。 (特別Random.Next(int, int)
  • 在每次調用創建一個新的隨機很可能導致重複的字符串
  • 調用只用鑄造
  • 相比Convert.ToInt32和Convert.ToChar看起來醜陋的下殼事後相比,似乎毫無意義與採摘小寫字母開始與
  • 提供了一個字母,從挑選是很多更靈活(與輔助方法在通常情況下)
+0

是的,我認爲這樣好多了。只需創建一個充滿可接受字符的字符串,然後從該字符串中隨機選擇字符,構建自己的字符。 我認爲上面的例子可以簡化,不需要將rng和alphabet參數傳遞給方法,但它給了你這個想法。 – Jeremy 2009-06-10 16:24:15

+0

@Jeremy:除非你想要一個可能創建重複字符串的方法,否則通過RNG非常重要。你*可以*保持一個靜態的Random實例,但是你也需要擔心鎖定。 – 2009-06-10 16:25:45

1

如果我要做到這一點(和我有,b在Java中,在某處松鼠),我會提供一個允許的字符數組,並使用一個RNG來挑選字符的索引。這也可以讓你不允許你不想生成的字符(如果你正在創建一個人可進入的許可證密鑰,你不想生成可以相互混淆的字符;例如0和O,或1和1)。

編輯:是的,像什麼喬恩沒有...

1

Path.GetRandomFileName()

string randomName = Path.GetRandomFileName(); 
randomName = randomName.Replace(".", string.Empty); 

// take substring... 
相關問題