Generate random string
Possible Duplicate:
c# random string generator
我需要生成一个具有给定长度的随机字符串。这是迄今为止我的代码。问题是随机字符串就像"rrrrrr"或"sssss"每次都是同一个字母。就在我重新启动应用程序时,字母改变了。我需要"asrdvgdgregd"之类的东西
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public string GenerateChar() { Random random = new Random(); return Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))).ToString(); } public string GenerateChar(int count) { string randomString =""; for (int i = 0; i < count; i++) { nahodneZnaky += GenerateChar(); } return randomString; } |
尝试对整个字符串使用相同的随机对象,而不是为每个字符初始化一个对象。
随机对象将根据从"种子"数开始的数学级数生成"伪随机"数。如果每次将随机对象初始化为相同的种子,实际上可以获得相同的"随机"数字序列。
现在,当您在不指定种子的情况下初始化Random时,它将把计算机的时钟作为种子。在这种情况下,您可能做得足够快,以至于时钟没有从一个初始化更改为另一个初始化,并且您总是得到相同的种子。
最好在生成随机字符串的函数中初始化随机对象,并将其作为参数传递给generatechar函数,以便在随机对象的同一实例上多次调用NextDouble(),而不是在不同的实例上只调用一次。
您可以省去麻烦,使用membership.generatepassword方法。它本质上是做你所需要的。
用途:
1 2 3 | int passwordLength = 5; int alphaNumericalCharsAllowed = 2; string random = Membership.GeneratePassword(passwordLength, alphaNumericalCharsAllowed); |
对于可读性,也可以将其包装为一个助手方法:
1 2 3 4 | private string GenerateRandomString(int length, int alphaNumericalChars) { return Membership.GeneratePassword(length, alphaNumericalChars); } |
不要在每次迭代中创建EDOCX1的新实例(0),这将以毫秒为单位对每个实例进行种子设定,显然在两次迭代之间不会发生变化。
创建一个
试试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public char GenerateChar(Random rng) { // 'Z' + 1 because the range is exclusive return (char) (rng.Next('A', 'Z' + 1)); } public string GenerateString(Random rng, int length) { char[] letters = new char[length]; for (int i = 0; i < length; i++) { letters[i] = GenerateChar(rng); } return new string(letters); } private static readonly Random SingleRandom = new Random(); public string GenerateStringNotThreadSafe(int length) { return GenerateString(SingleRandom, length); } |
现在值得注意的是,
作为miscUtil的一部分,我有一个
没什么特别的,只是很短。32和127是要生成的字符的最小和最大范围。
1 2 3 4 5 |
我知道这可能不是最好的解决方案,但我有点希望能够指定"允许"字符:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | private const int _defaultNumberOfCharacters = 8; private const int _defaultExpireDays = 10; private static readonly string _allowedCharacters ="bcdfghjklmnpqrstvxz0123456789"; public static string GenerateKey(int numberOfCharacters) { const int from = 0; int to = _allowedCharacters.Length; Random r = new Random(); StringBuilder qs = new StringBuilder(); for (int i = 0; i < numberOfCharacters; i++) { qs.Append(_allowedCharacters.Substring(r.Next(from, to), 1)); } return qs.ToString(); } |
http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx
1 2 3 4 | string randomName = Path.GetRandomFileName(); randomName = randomName.Replace(".", string.Empty); // take substring... |
尝试静态
1 2 3 4 5 6 | public string GenerateChar() { static Random random = new Random(); return Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))).ToString(); } |
根据字符串中所需的确切字符,您可能会发现
您应该在方法之外初始化随机变量:
1 2 3 4 5 6 7 8 | public Random random = new Random(); public string GenerateChar() { return Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))).ToString(); } ... |
从调用方法传递
试试这个。
1 2 3 4 5 6 7 8 9 10 | public string GetRandomString() { int randomNumber = new Random().Next(); string RandomString = string.Empty; for(int i = 0;i < randomNumber.ToString().Length;i++) { RandomString += ((char)Convert.ToUInt32(randomNumber.ToString()[i])).ToString(); } return RandomString; } |