可能重复: c#随机串发生器
我需要生成一个具有给定长度的随机字符串。到目前为止这是我的密码。问题是,随机字符串每次都像"RRRRRR“或"SSSSS”一样。就在我重新启动应用程序时,字母发生了变化。我需要像"asrDvgDgREGd“这样的东西
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;
}发布于 2009-10-15 14:34:07
尝试对整个字符串使用相同的随机对象,而不是为每个字符初始化一个。
随机对象将产生一个“伪随机”数,基于从“种子”数开始的数学进展。如果每次将随机对象初始化为相同的种子,则实际上可以得到相同的“随机”数字序列。
现在,当您不指定种子而初始化the时,它将以计算机的时钟作为种子。在这种情况下,您可能做的足够快,时钟没有改变从一个初始化到另一个,你总是得到相同的种子。
最好是在生成随机字符串的函数中初始化随机对象,并将其作为参数传递给GenerateChar函数,这样就可以在随机对象的同一个实例上多次调用NextDouble(),而不是只在不同的实例上调用一次。
发布于 2009-10-15 14:37:17
您可以省去麻烦,使用Membership.GeneratePassword方法。本质上是做你想做的事。
用法:
int passwordLength = 5;
int alphaNumericalCharsAllowed = 2;
string random = Membership.GeneratePassword(passwordLength, alphaNumericalCharsAllowed);为了提高可读性,您可以将其封装在帮助器方法中:
private string GenerateRandomString(int length, int alphaNumericalChars)
{
return Membership.GeneratePassword(length, alphaNumericalChars);
}发布于 2009-10-15 14:34:18
不要在每次迭代中创建一个新的Random实例--这将用当前时间(以毫秒为单位)为每个实例的种子,这显然不太可能在迭代之间发生变化。
创建Random的单个实例,并将其传递给方法。我还建议您不要在循环中连接这样的字符串,甚至不要创建这么多字符串。此外,如果您使用Random.Next(int, int)使您的生活更轻松。
试试这个:
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);
}现在值得注意的是,Random并不是线程安全的,所以如果您有多个线程,就不应该只在静态变量中有一个Random实例而不进行锁定。解决这个问题的方法有很多种--要么创建一个线程安全的Random子类,要么创建一组执行相同操作的静态方法,或者使用线程局部变量在每个线程中拥有一个实例。
我有一个班级作为MiscUtil的一部分,但是现在我倾向于使用线程本地版本,并在适当的情况下将它传递到链中。总有一天我会把它作为MiscUtil的另一种选择.
https://stackoverflow.com/questions/1572733
复制相似问题