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(); } |
我更愿意将
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)。
编辑:是的,就像乔恩做的……