Alles was ich will, ist ein pragmatischer Zufallsgenerator in C #, also kann ich z.
%Vor%und es scheint quasi zufällig , z. Dummy-Daten zu generieren.
Die meisten Stapelüberlauffragen zu diesem Thema und im Web in eine philosophische Diskussion über wahre Zufälligkeit was mich im Moment nicht interessiert, z Ich habe eine in PHP vor langer Zeit gemacht, die Millisekunden / sleep verwendet, was für Dummy-Daten gut ist, Ich versuche das nur in C # schnell .
Hat irgendjemand einen schnellen halbwegs brauchbaren C # Zufallsgenerator basierend auf einer Zeit als Startwert, etc. oder, wie könnte ich den folgenden Code ändern, so dass er immer nicht die selbe 5 erzeugt Anzahl in einer Reihe?
%Vor%Auf diese Weise erstellen Sie nicht jedes Mal ein neues zufälliges Objekt, sondern Sie verwenden dasselbe. Wenn Sie eine neue schnell genug neu erstellen, werden sie die gleichen Ergebnisse liefern. Wenn Sie jedoch einen vorhandenen wiederverwenden, erhalten Sie Zufälligkeit.
Die Antwort von BFree ist in Ordnung, aber ich denke, es ist auch erwähnenswert, ein etwas anderes Muster zu verwenden - die Random
-Instanz wird in alles, was sie benötigt, übergeben, anstatt immer eine einzelne Instanz über eine statische Variable zu verwenden. Der Nachteil des letzteren Ansatzes ist, dass Random
nicht Thread-sicher ist. Sie benötigen entweder locking oder thread-lokale Variablen oder vermeiden die Verwendung mehrerer Threads für den Anfang. Also würde ich den ursprünglichen Code in der Frage anpassen:
Es ist nur eine grundlegende Umkehrung der Kontrolle, wirklich. Sie könnten einen statischen RNG mit Sperrfunktion haben, um eine neue Instanz von Random
auf threadsichere Weise zu erzeugen, wenn Sie sie benötigen (indem Sie zufällig einen Startwert erzeugen und diesen dann zum Erstellen verwenden die Instanz) und dann die Random
in einem bestimmten single-threaded Satz von Operationen wiederverwenden.
Das Problem (von 5 gleichen Nummern) ist ein Timing-Problem, die Antwort von BFree löst es. Die Random-Klasse erstellt sich selbst mit dem Timer, Ihre Aufrufe sind so nah beieinander, dass sie den gleichen Seed verwenden.