Der folgende Code versucht zu veranschaulichen, was ich will. Ich möchte grundsätzlich zwei Instanzen von "zufällig", die unabhängig voneinander arbeiten. Ich möchte "random" innerhalb einer Klasse säen, ohne "zufällig" in einer anderen Klasse zu beeinflussen. Wie kann ich das tun?
%Vor% Die Klasse random.Random
existiert speziell, um das gewünschte Verhalten zu ermöglichen - Module sind intrinsisch Singletons, aber Klassen sind multipliziert instantiiert, so dass beide Arten von Bedürfnissen abgedeckt sind.
Sollten Sie jemals eine unabhängige Kopie eines Moduls benötigen (was Sie bei random
definitiv nicht tun!), versuchen Sie es mit copy.deepcopy
- in vielen Fällen wird es funktionieren. Der Bedarf ist jedoch sehr selten, da Module normalerweise keine globalen änderbaren Zustände behalten, außer indem sie eine privilegierte Instanz einer Klasse behalten, die sie auch für "externen Konsum" anbieten (andere Beispiele neben random
include fileinput
).
Erstellen Sie für die gesetzten Zufallszahlen eine eigene Instanz von random.Random
. Die random
-Dokumentation erläutert diese Klasse, die das Modul von einer einzigen Instanz abhängig macht, wenn Sie die Funktionen direkt verwenden in ihm.
Traurigerweise kann das Vorhandensein von zwei unabhängigen RNGs weniger zufällig sein als die Verwendung eines einzelnen RNG, der einen "Offset" in die erzeugte Sequenz verwendet.
Wenn Sie einen "Offset" verwenden, müssen Sie beide vollständigen Sequenzen von Samples generieren und sie dann für Ihre Simulation verwenden. So etwas.
%Vor%RNGs können nur für einen einzelnen Seed und eine einzelne Zahlenfolge wünschenswerte Zufälligkeitseigenschaften aufweisen. Da zwei parallele Sequenzen die gleichen Konstanten für den Multiplikator und den Modulus verwenden, besteht die Möglichkeit, dass sie eine nachweisbare Korrelation zueinander haben.