Frage

Bei Verwendung eines Random Number Generators, der der bessere Weg ist es für eine größere Zufälligkeit des neuen Wertes zu verwenden:

  1. eine Methode, die eine neue Instanz des RNG jedes Mal instanziiert und dann einen Wert zurückgibt?

  2. Haben Sie eine Instanz der RNG auf Klassenebene, die einmal im Constructor instanziert wird, und alle nachfolgenden Gespräche für einen neuen Zufallswert mit der vorhandenen Instanz?

Das Problem ist, dass es viele Anrufe für eine Zufallszahl sein kann, oft in verschiedenen Bereichen nicht miteinander verbunden sind.

Dies ist kein Performance-Problem, so die Tatsache, dass jeder Anruf eine neue Instanz instanziiert könnte macht keinen Unterschied. Das ist alles über die Zufälligkeit des zurückgegebenen Wertes.

War es hilfreich?

Lösung

Edit: Ich glaube, ich meine Option 3, wie in einer anderen Antwort erwähnt, das heißt ein globaler Zufall Manager, obwohl innerhalb einer bestimmten Klasse, die Sie genau das Gleiche doe können

.

Ein weiterer Vorteil der Verwendung von Option 2 besteht darin, dass, wenn Sie jemals „Replay“ -Funktion in Ihrer Software benötigen, können Sie einfach den Samen speichern können, die Sie die RNG initialisieren verwendet. Das nächste Mal müssen Sie nur die RNG zwingen, die gespeicherten Samen zu verwenden, und Sie werden genau die gleiche Menge von Verhalten bekommen, unter der Annahme, dass es keine anderen Themen wie Gleichzeitigkeit / Threading, die die Reihenfolge der Ausführung ändern könnte .

Sie könnten so etwas tun, wenn Sie Ihre Software ein Experiment ausgeführt wird, die eine Menge an Zufälligkeit erfordert, aber wo möchten Sie vielleicht einen bestimmten Lauf wiederholen, um andere Menschen zu demonstrieren. Es wird verwendet, auch eine Menge in Computerspielen, wo die KI Entscheidungen auf der Grundlage Gewichtungen der möglichen Entscheidungen nehmen, aber mit letztlich einer Zufallszahl „picking“, welche Maßnahmen sie ergreifen.

Es ist auch möglich, das Debuggen für transiente Fehler, die nur gelegentlich auftreten. Wenn Sie die Samen von jedem Lauf nicht speichern gibt es keine Möglichkeit, die genauen Bedingungen zu erstellen, die den Fehler verursacht hat.

Andere Tipps

Option 1 nicht funktioniert, eigentlich.

Option 2 ist die einzige Wahl. RNG unbedingt erforderlich, dass Sie die Werte in der Reihenfolge von einem einzigen Samen erzeugen.

Sie „einen neuen Generator mit einem neuen Samen schaffen“ brechen die mathematische Grundlage. Was man bekommt, dann hängt ganz von Ihren Samen, die - leider -. Nicht sehr zufällig sein

Ich schlage vor, die Option 3: eine einzelne RNG im gesamten Programm verwendet. Es erfordert Sperren oder ein Thread-local, wenn die RNG ist nicht thread-sicher (beispielsweise in .NET), aber es macht das Leben viel einfacher und Sie brauchen sich nicht um eine Wiederholung zu kümmern.

Siehe die entsprechende MiscUtil Einzelheiten der. NET StaticRandom Klasse schrieb ich für diesen Zweck. (Es ist unglaublich einfach -. Nichts gescheit überhaupt)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top