我在静态类中有一个静态方法,它可以生成随机字符串,如下所示:
public static class DataGenerator
{
public static string GenerateRandomString(int length)
{
const string Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
return new string(
Enumerable.Repeat(Chars, length)
.Select(s => s[random.Next(s.Length)])
.ToArray());
}
}
当我从同一个调用函数多次调用此方法时,它似乎缓存生成的字符串。
以下是一个使用示例:
var item = new CodeDescActivePo()
{
Active = true,
Code = DataGenerator.GenerateRandomString(10),
Description = DataGenerator.GenerateRandomString(10)
};
请注意,有两次调用GenerateRandomString,我希望有2个唯一的随机数,在这种情况下,Code和Description总是相同的。
为什么GenerateRandomString每次都不会生成新的随机数?
答案 0 :(得分:9)
您正在快速呼叫var random = new Random();
。由于默认种子是基于时间的,因此种子是相同的。最好每次需要时创建一次变量Random.Next()
。
public static class DataGenerator
{
private readonly static Random random = new Random();
public static string GenerateRandomString(int length)
{
//etc etc using random.Next()
}
}
答案 1 :(得分:1)
因为您正在为每个呼叫使用new Random()
个实例。默认情况下,它使用当前系统时间播种,这意味着同时创建的多个Random
实例将提供相同的值。
将Random
实例设为static
字段,以使其在调用之间保持活动状态。
答案 2 :(得分:0)
<强>问题:强>
来自MSDN
默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。
解决方案:再次来自MSDN
使用单个Random对象生成所有随机数可以避免此问题。您还可以通过修改系统时钟返回的种子值,然后将此新种子值显式提供给Random(Int32)构造函数来解决此问题。有关更多信息,请参阅Random(Int32)构造函数。