从返回随机字符串的函数中看到相同的结果
本文关键字:结果 函数 返回 随机 字符串 | 更新日期: 2023-09-27 18:12:21
我是c#的新手,我有一个代码,调用相同的函数3次,返回一个随机字符串。由于某种原因,我的代码总是返回相同的字符串。请帮助。
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());
}
观察样本输出:AXCFSDRGAXCFSDRGAXCFSDRG
您正在构造三个独立的Random对象,而不是重用单个Random对象(这将是更好的实践)。
随机对象,如果没有提供种子,将使用当前时间作为种子。在本例中,randomString()方法的返回速度非常快,以至于所有三个Random对象都获得相同的种子,从而获得相同的输出序列。
基于此SO答案。
每次执行new 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);
}
}
使用RNGCryptoServiceProvider类:
https://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider (v = vs.110) . aspx
查看RNGCryptoServiceProvider:生成[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);
}
}
每次结果都不一样