C# 日期时间不变

C# 日期时间不变,c#,datetime,C#,Datetime,我在这段代码中的观点是创建一些随机日期应该很简单,但是 static void Main(string[] args) { Console.WriteLine(CreateDate()); Console.WriteLine(CreateDate()); Console.WriteLine(CreateDate()); } public static DateTime CreateDate() { Random rnd = new Random(); D

我在这段代码中的观点是创建一些随机日期应该很简单,但是

static void Main(string[] args) {
    Console.WriteLine(CreateDate());
    Console.WriteLine(CreateDate());
    Console.WriteLine(CreateDate());
}

public static DateTime CreateDate() {
    Random rnd = new Random();
    DateTime date = new DateTime(1990, 1, 1);

    date = date.AddDays(rnd.Next(30));
    date = date.AddMonths(rnd.Next(11));
    date = date.AddYears(rnd.Next(28));

    return date;
}
输出总是一样的。。。 我错过了什么


无论我做什么,日期都不会改变。

您需要将随机对象移出方法

所有随机实例都使用由系统时钟导出的相同默认值进行播种,这是因为它们是紧密连续的,并且具有有限的分辨率,并且将在Random.Next调用上产生相同的结果

随机构造函数使用系统时钟提供种子 价值这是实例化随机数最常用的方法 发电机

如果将同一种子用于单独的随机对象,则它们将 生成相同的随机数序列。这对我们来说很有用 创建处理随机值的测试套件,或用于重放 从随机数中获取数据的游戏。但是,请注意 在不同版本下运行的进程中的随机对象 .NET Framework可能会返回不同的随机数序列,即使 它们被实例化为相同的种子值


来自官方msdn文档。

您需要将随机对象移出方法

所有随机实例都使用由系统时钟导出的相同默认值进行播种,这是因为它们是紧密连续的,并且具有有限的分辨率,并且将在Random.Next调用上产生相同的结果

随机构造函数使用系统时钟提供种子 价值这是实例化随机数最常用的方法 发电机

如果将同一种子用于单独的随机对象,则它们将 生成相同的随机数序列。这对我们来说很有用 创建处理随机值的测试套件,或用于重放 从随机数中获取数据的游戏。但是,请注意 在不同版本下运行的进程中的随机对象 .NET Framework可能会返回不同的随机数序列,即使 它们被实例化为相同的种子值

来自官方msdn文档。

您不断创建新的随机数,这将导致生成相同的伪随机数序列

创建一次Random,并将其传递给CreateDate:

您不断创建新的随机数,这将导致生成相同的伪随机数序列

创建一次Random,并将其传递给CreateDate:


您只需要随机类的一个实例。创建新实例可能发生在同一时间实例中,因此生成相同的值。new Random以当前时间作为种子初始化Random类。由于每次调用都使用相同的种子创建Random,因此随机值是相同的,因此不是非常随机的。您只需要Random类的一个实例。创建新实例可能发生在同一时间实例中,因此生成相同的值。new Random以当前时间作为种子初始化Random类。因为每次调用都使用相同的种子创建随机值,所以随机值是相同的,所以不是很随机。也许这句话更适合这个问题?>默认种子值源自系统时钟,具有有限分辨率。因此,通过调用默认构造函数连续创建的不同随机对象将具有相同的默认种子值可能此引号更适合此问题?>默认种子值源自系统时钟,具有有限分辨率。因此,通过调用默认构造函数连续创建的不同随机对象将具有相同的默认种子值
// Inside Main()
var rnd = new Random();
Console.WriteLine(CreateDate(rnd));
Console.WriteLine(CreateDate(rnd));
Console.WriteLine(CreateDate(rnd));
...
// Change method signature
public static DateTime CreateDate(Random rnd) {
    DateTime date = new DateTime(1990, 1, 1);
    ... // The rest of the method remains the same
}