2009-06-10 49 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...