2017-12-28 50 views
1

Mein Punkt in diesem Code ändern ist, einige Zufallsdaten zu erstellen (sollte einfach sein), aber ...C# Datetime nicht

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; 
} 

Der Ausgang durchweg gleiche der ... Was bin ich?

Das Datum ändert sich nicht, was auch immer ich mache.

+6

Sie benötigen nur eine Instanz der Klasse Random. Das Erstellen neuer Instanzen erfolgt wahrscheinlich in derselben Zeit, sodass dieselben Werte erzeugt werden. –

+5

'new Random()' initialisiert die 'Random' Klasse mit der aktuellen Zeit als Seed. Da Sie die 'Random' bei jedem Aufruf ** mit dem gleichen Seed ** erstellen, sind die Zufallswerte gleich (und daher nicht sehr zufällig). –

Antwort

4

Sie müssen zufälliges Objekt aus der Methode verschieben.

Alle Random-Instanzen mit demselben Standardwert (abgeleitet von der Systemuhr, da sie in enger Folge mit endlicher Auflösung verbunden sind) und liefern dasselbe Ergebnis (beim Aufruf von random.Next()).

Der Konstruktor Random() verwendet die Systemuhr, um einen Seed-Wert bereitzustellen. Dies ist die gebräuchlichste Art der Instanziierung der Zufallszahl Generator.

Wenn das gleiche Samen für separate Zufall Objekte verwendet wird, wird sie die gleiche Reihe von Zufallszahlen erzeugen. Dies kann für Erstellen einer Testsuite nützlich sein, die zufällige Werte verarbeitet, oder für die Wiedergabe von Spielen, die ihre Daten aus Zufallszahlen ableiten. Beachten Sie jedoch, dass Zufällige Objekte in Prozessen unter verschiedenen Versionen des .NET Framework laufen können verschiedene Serien von Zufallszahlen zurück, auch wenn sie mit identischen Startwerte instanziiert sind.

Aus der offiziellen msdn Dokumentation .

+2

Wahrscheinlich passt dieses Zitat besser für diese Frage? > Der Standard-Startwert wird von der Systemuhr abgeleitet und hat eine begrenzte Auflösung. Dies hat zur Folge, dass verschiedene Random-Objekte, die durch einen Aufruf des Standardkonstruktors in enger Folge erstellt werden, identische Standard-Startwerte haben – zcui93

2

Sie halten neue Random zu schaffen, die die gleiche Sequenz von Pseudozufallszahlen zu machen führt.

erstellen Random einmal, und übergeben es an CreateDate:

// 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 
}