W dzisiejszym odcinku programistycznego horroru... W dokumentacji Pythona dotyczącej random.seed() mówimy: "Jeśli a jest liczbą całkowitą, jest używane bezpośrednio." [1] Ale jeśli użyjesz nasion 3 lub -3, otrzymasz dokładnie ten sam obiekt rng, produkujący te same strumienie. (TIL). W nanochat używałem znaku jako (jak myślałem) sprytnego sposobu na uzyskanie różnych sekwencji rng dla podziałów treningowych/testowych. Stąd paskudny błąd, ponieważ teraz train=test. Znalazłem kod CPython odpowiedzialny za to w cpython/Modules/_randommodule.c [2], gdzie w linii 321 widzimy w komentarzu: "Ten algorytm opiera się na tym, że liczba jest bez znaku. Więc: jeśli argument jest PyLong, użyj jego wartości bezwzględnej." a następnie n = PyNumber_Absolute(arg); co wyraźnie wywołuje abs() na twoim nasieniu, aby uczynić je dodatnim, odrzucając bit znaku. Ale ten komentarz jest również błędny/mylny. Pod maską Python wywołuje algorytm Mersenne Twister MT19937, który w ogólnym przypadku ma 19937 (niezerowych) bitów stanu. Python bierze twoją liczbę całkowitą (lub inne obiekty) i "rozprzestrzenia" te informacje po tych bitach. Zasadniczo bit znaku mógł być użyty do zwiększenia bitów stanu. Nie ma nic w algorytmie, co "opiera się na tym, że liczba jest bez znaku". Podjęto decyzję, aby nie uwzględniać bitu znaku (co moim zdaniem było błędem). Jednym z trywialnych przykładów mogłoby być mapowanie n -> 2*abs(n) + int(n < 0). Na koniec prowadzi nas to do kontraktu Pythona dotyczącego random, który również nie jest w pełni opisany w dokumentacji. Wspomniany kontrakt to: to samo nasienie => ta sama sekwencja. Ale nie ma gwarancji, że różne nasiona produkują różne sekwencje. Więc w zasadzie Python nie obiecuje, że np. seed(5) i seed(6) to różne strumienie rng. (Chociaż to dość powszechnie zakłada się w wielu aplikacjach.) Rzeczywiście, widzimy, że seed(5) i seed(-5) to identyczne strumienie. I prawdopodobnie nie powinieneś ich używać do oddzielania swoich zachowań treningowych/testowych w uczeniu maszynowym. Jeden z bardziej zabawnych programistycznych horrorów, które ostatnio napotkałem. Do zobaczenia w następnym odcinku. [1] [2]