Sie haben bereits viele richtige Beobachtungen gemacht!
Wenn Sie nicht beide Zufallsgeneratoren setzen möchten, ist es auf lange Sicht wahrscheinlich einfacher, den einen oder anderen Generator auszuwählen. Wenn Sie jedoch beide verwenden müssen, müssen Sie beide auch setzen, da sie unabhängig voneinander Zufallszahlen generieren.
Für numpy.random.seed()
die Hauptschwierigkeit ist, dass es nicht Thread-sicher ist - das heißt, es ist nicht sicher zu verwenden , wenn Sie viele verschiedene Ausführungs - Threads , weil es an der Arbeit nicht gewährleistet ist , wenn zwei verschiedene Threads die Funktion zur gleichen Zeit ausgeführt werden . Wenn Sie keine Threads verwenden und vernünftigerweise erwarten können, dass Sie Ihr Programm in Zukunft nicht mehr auf diese Weise neu schreiben müssen, numpy.random.seed()
sollte dies in Ordnung sein. Wenn Grund zu der Annahme besteht, dass Sie in Zukunft möglicherweise Threads benötigen, ist es auf lange Sicht viel sicherer, die vorgeschlagenen Schritte auszuführen und eine lokale Instanz der numpy.random.Random
Klasse zu erstellen . Soweit ich das beurteilen kann, random.random.seed()
ist es threadsicher (oder zumindest habe ich keine gegenteiligen Beweise gefunden).
Die numpy.random
Bibliothek enthält einige zusätzliche Wahrscheinlichkeitsverteilungen, die üblicherweise in der wissenschaftlichen Forschung verwendet werden, sowie einige praktische Funktionen zum Generieren von Arrays zufälliger Daten. Die random.random
Bibliothek ist etwas leichter und sollte in Ordnung sein, wenn Sie keine wissenschaftliche Forschung oder andere Arbeiten in der Statistik betreiben.
Andernfalls verwenden beide die Mersenne-Twister-Sequenz , um ihre Zufallszahlen zu generieren, und sie sind beide vollständig deterministisch. Wenn Sie also einige wichtige Informationen kennen, können Sie mit absoluter Sicherheit vorhersagen, welche Zahl als nächstes kommt . Aus diesem Grund ist weder numpy.random noch random.random für ernsthafte kryptografische Zwecke geeignet . Da die Sequenz jedoch sehr lang ist, eignen sich beide gut zum Generieren von Zufallszahlen, wenn Sie sich keine Sorgen über Personen machen, die versuchen, Ihre Daten rückzuentwickeln. Dies ist auch der Grund für die Notwendigkeit, den Zufallswert zu setzen - wenn Sie jedes Mal an derselben Stelle beginnen, erhalten Sie immer die gleiche Folge von Zufallszahlen!
Als Randbemerkung, wenn Sie keine Verschlüsselungs Ebene Zufälligkeit benötigen, sollten Sie die Verwendung Geheimnisse Modul, oder so etwas wie Crypto.Random , wenn Sie eine Python - Version früher als Python 3.6 verwenden.
random.random
allein verfügbar sind . Normalerweise brauchen Sie das aber nicht.Aus Python für die Datenanalyse
numpy.random
ergänzt das Modul den Pythonrandom
mit Funktionen zum effizienten Generieren ganzer Arrays von Stichprobenwerten aus vielen Arten von Wahrscheinlichkeitsverteilungen.Im Gegensatz dazu tastet das in Python integrierte
random
Modul jeweils nur einen Wert ab, währendnumpy.random
sehr große Samples schneller generiert werden können. Mit der IPython Magic-Funktion%timeit
kann man sehen, welches Modul schneller arbeitet:quelle
np.random.randint(2)
zurandom.randrange(2)
und NumPy war langsamer . NumPy: 1,25 us und Random: 891 ns. Und auch die gleiche Beziehung fürnp.random.rand()
undrandom.random()
.Die Quelle des Seeds und das verwendete Verteilungsprofil wirken sich auf die Ausgaben aus. Wenn Sie nach kryptografischer Zufälligkeit suchen, werden beim Seeding von os.urandom () nahezu echte zufällige Bytes vom Geräte-Chatter (dh Ethernet oder Festplatte) (dh /) abgerufen. dev / random auf BSD)
Dadurch wird vermieden, dass Sie einen Startwert angeben und so deterministische Zufallszahlen generieren. Die zufälligen Aufrufe ermöglichen es Ihnen dann jedoch, die Zahlen an eine Verteilung anzupassen (was ich als wissenschaftliche Zufälligkeit bezeichne - schließlich ist alles, was Sie wollen, eine Glockenkurvenverteilung von Zufallszahlen. Numpy ist am besten darin, dies zu untersuchen.
Also ja, bleiben Sie bei einem Generator, aber entscheiden Sie, welchen Zufall Sie wollen - zufällig, aber definitiv aus einer Verteilungskurve oder so zufällig, wie Sie es ohne ein Quantengerät bekommen können.
quelle