关于C#:这是生成随机字符字符串的好方法吗?

 2019-04-29 

Is this a good way to generate a string of random characters?

我发现这段代码生成了一个随机字符字符串。

但有没有一种更优雅、更快、更可靠的方法来做到这一点呢?这似乎取决于数字26-91是给定当前编码的有效字符这一事实。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// <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();
}


我更愿意将Random实例传递到方法中,然后您可以多次重复使用同一实例,如果需要快速连续生成大量随机字符串,这一点很重要。不过,我还是会稍微修改一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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.Next(int, int))
  • 在每个调用上创建一个新的随机对象可能会导致重复的字符串
  • 调用convert.toint32和convert.tochar与刚才的casting相比显得很难看
  • 较低的大小写后面似乎没有意义比选择小写字母开始
  • 提供一个字母表来选择是非常灵活的(对于常见的情况有辅助方法)


path.getrandomFileName()。

1
2
3
4
string randomName = Path.GetRandomFileName();
randomName = randomName.Replace(".", string.Empty);

// take substring...


如果我是这样做的(我有,但在爪哇,在某处拼凑),我会提供一个允许的字符数组,并且使用RNG简单地选择字符的索引。这还允许您禁止不想生成的字符(如果您正在创建一个人类可输入的许可证密钥,则不希望生成相互混淆的字符;例如0和o,或1和l)。

编辑:是的,就像乔恩做的……