这是生成一串随机字符的好方法吗?

时间:2009-06-10 16:15:48

标签: c# string random

我发现这个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();
}

3 个答案:

答案 0 :(得分:24)

我更愿意将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)
  • 每次调用时创建一个新的Random可能会导致重复的字符串
  • 调用Convert.ToInt32和Convert.ToChar与刚刚投射
  • 相比似乎很难看
  • 一起选择小写字母相比,>
  • 提供一个可供选择的字母表更灵活(使用常见情况的辅助方法)

答案 1 :(得分:1)

如果我这样做(我有,但是在Java中,在某个地方躲开),我会提供一系列允许的字符,并使用RNG简单地选择字符的索引。这也可以让你禁止你不想生成的字符(如果你正在创建一个人类可输入的许可证密钥,你不想生成可以互相混淆的字符;例如,0和O或1和l)。

编辑:是的,就像Jon做的那样......

答案 2 :(得分:1)

Path.GetRandomFileName()

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

// take substring...