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

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

但有没有更优雅/更快/更可靠的方式来做到这一点? 这似乎依赖于在给定当前编码的情况下数字26-91是有效字符的事实。

///  /// Generates a random string with the given length ///  /// Size of the string /// If true, generate lowercase string /// Random string 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实例传递给方法 – 然后你可以多次重复使用同一个实例,这对于你需要快速连续生成大量随机字符串很重要。 但是,我还要修改一下:

 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似乎很难看
  • 与开始使用小写字母相比, 之后的下套管似乎毫无意义
  • 提供一个可供选择的字母表更灵活(对于常见情况使用辅助方法)

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

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

Path.GetRandomFileName()

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