In der heutigen Episode des Programmier-Horrors... In den Python-Dokumenten zur random.seed() Funktion wird uns gesagt: "Wenn a ein int ist, wird es direkt verwendet." [1] Aber wenn du mit 3 oder -3 seedest, erhältst du tatsächlich dasselbe rng-Objekt, das die gleichen Streams erzeugt. (TIL). In nanochat habe ich das Vorzeichen als (was ich dachte, war) clevere Methode verwendet, um unterschiedliche rng-Sequenzen für Train/Test-Splits zu erhalten. Daher ein fieser Bug, denn jetzt ist train=test. Ich fand den CPython-Code, der dafür verantwortlich ist, in cpython/Modules/_randommodule.c [2], wo wir in Zeile 321 in einem Kommentar sehen: "Dieser Algorithmus basiert darauf, dass die Zahl unsigned ist. Also: Wenn das Argument ein PyLong ist, verwende seinen Absolutwert." gefolgt von n = PyNumber_Absolute(arg); was explizit abs() auf deinen Seed aufruft, um ihn positiv zu machen und das Vorzeichenbit zu verwerfen. Aber dieser Kommentar ist tatsächlich auch falsch/misleading. Im Hintergrund ruft Python den Mersenne Twister MT19937 Algorithmus auf, der im Allgemeinen 19937 (nicht-null) Bits Zustand hat. Python nimmt dein int (oder andere Objekte) und "verteilt" diese Informationen über diese Bits. Prinzipiell hätte das Vorzeichenbit verwendet werden können, um die Zustandsbits zu erweitern. Es gibt nichts am Algorithmus, das "darauf basiert, dass die Zahl unsigned ist". Es wurde die Entscheidung getroffen, das Vorzeichenbit nicht zu integrieren (was meiner Meinung nach ein Fehler war). Ein triviales Beispiel hätte sein können, n -> 2*abs(n) + int(n < 0) zuzuordnen. Schließlich führt uns das zum Vertrag von Pythons random, der auch nicht vollständig in den Dokumenten dargelegt ist. Der erwähnte Vertrag besagt: gleicher Seed => gleiche Sequenz. Aber es wird keine Garantie gegeben, dass unterschiedliche Seeds unterschiedliche Sequenzen erzeugen. Prinzipiell macht Python keine Versprechen, dass z.B. seed(5) und seed(6) unterschiedliche rng-Streams sind. (Obwohl dies in vielen Anwendungen ziemlich häufig implizit angenommen wird.) In der Tat sehen wir, dass seed(5) und seed(-5) identische Streams sind. Und du solltest sie wahrscheinlich nicht verwenden, um dein Train/Test-Verhalten im maschinellen Lernen zu trennen. Eines der amüsanteren Programmier-Horror-Footguns, auf die ich kürzlich gestoßen bin. Wir sehen uns in der nächsten Episode. [1] [2]