我是C#的新手,我有一个代码,它调用相同的函数3次,返回一个随机的sting。出于某种原因,我的代码始终返回相同的字符串。请帮忙。
public static String randomString()
{
String chars = "QWERTYUIOPASDFGHJKLZXCVBNM";
Random rand = new Random();
String finalstring = null;
for (int i = 0; i < 8; i++)
{
finalstring += chars[rand.Next(0, chars.Length - 1)];
}
return finalstring;
}
public void SecondTest()
{
Console.WriteLine(Class1.randomString());
Console.WriteLine(Class1.randomString());
Console.WriteLine(Class1.randomString());
}
示例输出观察: AXCFSDRG AXCFSDRG AXCFSDRG
答案 0 :(得分:1)
你正在构建三个独立的Random对象,而不是重用一个Random对象(这将是更好的练习)。
如果您不提供种子,随机对象将以当前时间播种。在这种情况下,您的randomString()方法返回得如此之快,以至于所有三个Random对象都获得相同的种子,从而得到相同的输出序列。
答案 1 :(得分:1)
基于此SO Answer。
每次执行新的Random()时,都会使用时钟进行初始化。这个 意味着在紧密循环中,您可以多次获得相同的值。您 应该保留一个Random实例并继续使用Next 实例
//Function to get random number
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
lock(syncLock) { // synchronize
return random.Next(min, max);
}
}
答案 2 :(得分:-1)
使用RNGCryptoServiceProvider类:
查看RNGCryptoServiceProvider: generate random numbers in the range [0, randomMax)
如果您在答案和以下内容中使用了扩展方法:
public static String randomString()
{
String chars = "QWERTYUIOPASDFGHJKLZXCVBNM";
Random rand = new Random();
String finalstring = null;
for (int i = 0; i < 8; i++)
{
finalstring += chars[GenerateRandomNumber(8)];
}
return finalstring;
}
public static int GenerateRandomNumber(int length)
{
using (var randomNumberGenerator = new RNGCryptoServiceProvider())
{
return randomNumberGenerator.GetNextInt32(length);
}
}
每次结果都不同。